private void ForceRewriteRawJsonValue()

in Microsoft.Azure.Cosmos/src/Json/JsonWriter.JsonBinaryWriter.cs [1623:1805]


            private void ForceRewriteRawJsonValue(
                ReadOnlyMemory<byte> rootBuffer,
                int valueOffset,
                UniformArrayInfo externalArrayInfo,
                bool isFieldName,
                IJsonStringDictionary jsonStringDictionary)
            {
                ReadOnlyMemory<byte> rawJsonValue = rootBuffer.Slice(valueOffset);
                byte typeMarker = rawJsonValue.Span[0];

                if (externalArrayInfo != null)
                {
                    this.WriteRawUniformArrayItem(rawJsonValue.Span, externalArrayInfo);
                }
                else
                {
                    RawValueType rawType = (RawValueType)RawValueTypes[typeMarker];

                    // Check for uniform number array support
                    if (this.enableNumberArrays && ((rawType == RawValueType.ArrNum) || (rawType == RawValueType.ArrArrNum)))
                    {
                        rawType = RawValueType.Token;
                    }

                    // Check for unsigned 64-bit integer support
                    if (this.enableUInt64Values && (rawType == RawValueType.NumUI64))
                    {
                        rawType = RawValueType.Token;
                    }

                    switch (rawType)
                    {
                        case RawValueType.Token:
                            {
                                int valueLength = JsonBinaryEncoding.GetValueLength(rawJsonValue.Span);

                                rawJsonValue = rawJsonValue.Slice(start: 0, length: valueLength);

                                // We only care if the type is a field name or not
                                this.JsonObjectState.RegisterToken(isFieldName ? JsonTokenType.FieldName : JsonTokenType.String);

                                this.binaryWriter.Write(rawJsonValue.Span);

                                if (!isFieldName)
                                {
                                    this.bufferedContexts.Peek().Count++;
                                }
                            }
                            break;

                        case RawValueType.StrUsr:
                        case RawValueType.StrEncLen:
                        case RawValueType.StrL1:
                        case RawValueType.StrL2:
                        case RawValueType.StrL4:
                            this.WriteRawStringValue(rawType, rawJsonValue, isFieldName, this.jsonStringDictionary);
                            break;

                        case RawValueType.StrR1:
                            this.ForceRewriteRawJsonValue(
                                rootBuffer,
                                JsonBinaryEncoding.GetFixedSizedValue<byte>(rawJsonValue.Slice(start: 1).Span),
                                default,
                                isFieldName,
                                jsonStringDictionary);
                            break;
                        case RawValueType.StrR2:
                            this.ForceRewriteRawJsonValue(
                                rootBuffer,
                                JsonBinaryEncoding.GetFixedSizedValue<ushort>(rawJsonValue.Slice(start: 1).Span),
                                default,
                                isFieldName,
                                jsonStringDictionary);
                            break;
                        case RawValueType.StrR3:
                            this.ForceRewriteRawJsonValue(
                                rootBuffer,
                                JsonBinaryEncoding.GetFixedSizedValue<JsonBinaryEncoding.UInt24>(rawJsonValue.Slice(start: 1).Span),
                                default,
                                isFieldName,
                                jsonStringDictionary);
                            break;
                        case RawValueType.StrR4:
                            this.ForceRewriteRawJsonValue(
                                rootBuffer,
                                JsonBinaryEncoding.GetFixedSizedValue<int>(rawJsonValue.Slice(start: 1).Span),
                                default,
                                isFieldName,
                                jsonStringDictionary);
                            break;

                        case RawValueType.Arr1:
                            {
                                this.JsonObjectState.RegisterToken(JsonTokenType.BeginArray);

                                this.binaryWriter.Write(typeMarker);

                                this.ForceRewriteRawJsonValue(
                                    rootBuffer,
                                    valueOffset: valueOffset + 1,
                                    externalArrayInfo: default,
                                    isFieldName: false,
                                    jsonStringDictionary: jsonStringDictionary);

                                this.JsonObjectState.RegisterToken(JsonTokenType.EndArray);
                            }
                            break;

                        case RawValueType.Obj1:
                            {
                                this.JsonObjectState.RegisterToken(JsonTokenType.BeginObject);

                                this.binaryWriter.Write(typeMarker);

                                this.ForceRewriteRawJsonValue(
                                    rootBuffer,
                                    valueOffset: valueOffset + 1,
                                    externalArrayInfo: default,
                                    isFieldName: true,
                                    jsonStringDictionary: jsonStringDictionary);

                                int nameLength = JsonBinaryEncoding.GetValueLength(rawJsonValue.Slice(start: 1).Span);

                                this.ForceRewriteRawJsonValue(
                                    rootBuffer,
                                    valueOffset: valueOffset + 1 + nameLength,
                                    externalArrayInfo: default,
                                    isFieldName: false,
                                    jsonStringDictionary: jsonStringDictionary);

                                this.JsonObjectState.RegisterToken(JsonTokenType.EndObject);
                            }
                            break;

                        case RawValueType.Arr:
                            {
                                this.WriteArrayStart();

                                foreach (JsonBinaryEncoding.Enumerator.ArrayItem arrayItem in JsonBinaryEncoding.Enumerator.GetArrayItems(rootBuffer, valueOffset, externalArrayInfo))
                                {
                                    this.ForceRewriteRawJsonValue(
                                        rootBuffer,
                                        arrayItem.Offset,
                                        arrayItem.ExternalArrayInfo,
                                        isFieldName,
                                        jsonStringDictionary);
                                }

                                this.WriteArrayEnd();
                            }
                            break;

                        case RawValueType.Obj:
                            {
                                this.WriteObjectStart();

                                foreach (JsonBinaryEncoding.Enumerator.ObjectProperty property in JsonBinaryEncoding.Enumerator.GetObjectProperties(rootBuffer, valueOffset))
                                {
                                    this.ForceRewriteRawJsonValue(rootBuffer, property.NameOffset, externalArrayInfo: default, isFieldName: true, jsonStringDictionary: this.jsonStringDictionary);
                                    this.ForceRewriteRawJsonValue(rootBuffer, property.ValueOffset, externalArrayInfo: default, isFieldName: false, jsonStringDictionary: this.jsonStringDictionary);
                                }

                                this.WriteObjectEnd();
                            }
                            break;

                        case RawValueType.ArrNum:
                            this.WriteRawNumberArray(rawJsonValue.Span, GetUniformArrayInfo(rawJsonValue.Span));
                            break;

                        case RawValueType.ArrArrNum:
                            this.WriteRawNumberArrayArray(rawJsonValue.Span, GetUniformArrayInfo(rawJsonValue.Span));
                            break;

                        case RawValueType.NumUI64:
                            this.WriteNumberValue(GetFixedSizedValue<ulong>(rawJsonValue.Slice(1).Span));
                            break;

                        default:
                            throw new InvalidOperationException($"Unknown {nameof(RawValueType)} {rawType}.");
                    }
                }
            }