private static void EscapeString(ReadOnlySpan <char> value, Span <char> destination, JavaScriptEncoder encoder, ref int written)
        {
            Debug.Assert(encoder != null);

            OperationStatus result = encoder.Encode(value, destination, out int encoderBytesConsumed, out int encoderCharsWritten);

            Debug.Assert(result != OperationStatus.DestinationTooSmall);
            Debug.Assert(result != OperationStatus.NeedMoreData);

            if (result != OperationStatus.Done)
            {
                ThrowHelper.ThrowArgumentException_InvalidUTF16(value[encoderCharsWritten]);
            }

            Debug.Assert(encoderBytesConsumed == value.Length);

            written += encoderCharsWritten;
        }
        private static void EscapeNextChars(ReadOnlySpan <char> value, int firstChar, Span <char> destination, ref int consumed, ref int written)
        {
            int nextChar = -1;

            if (IsInRangeInclusive(firstChar, JsonConstants.HighSurrogateStartValue, JsonConstants.LowSurrogateEndValue))
            {
                consumed++;
                if (value.Length <= consumed || firstChar >= JsonConstants.LowSurrogateStartValue)
                {
                    ThrowHelper.ThrowArgumentException_InvalidUTF16(firstChar);
                }

                nextChar = value[consumed];
                if (!IsInRangeInclusive(nextChar, JsonConstants.LowSurrogateStartValue, JsonConstants.LowSurrogateEndValue))
                {
                    ThrowHelper.ThrowArgumentException_InvalidUTF16(nextChar);
                }
            }

            destination[written++] = '\\';
            switch (firstChar)
            {
            case JsonConstants.LineFeed:
                destination[written++] = 'n';
                break;

            case JsonConstants.CarriageReturn:
                destination[written++] = 'r';
                break;

            case JsonConstants.Tab:
                destination[written++] = 't';
                break;

            case JsonConstants.BackSlash:
                destination[written++] = '\\';
                break;

            case JsonConstants.BackSpace:
                destination[written++] = 'b';
                break;

            case JsonConstants.FormFeed:
                destination[written++] = 'f';
                break;

            default:
                destination[written++] = 'u';
#if BUILDING_INBOX_LIBRARY
                firstChar.TryFormat(destination.Slice(written), out int charsWritten, HexFormatString);
                Debug.Assert(charsWritten == 4);
                written += charsWritten;
#else
                written = WriteHex(firstChar, destination, written);
#endif
                if (nextChar != -1)
                {
                    destination[written++] = '\\';
                    destination[written++] = 'u';
#if BUILDING_INBOX_LIBRARY
                    nextChar.TryFormat(destination.Slice(written), out charsWritten, HexFormatString);
                    Debug.Assert(charsWritten == 4);
                    written += charsWritten;
#else
                    written = WriteHex(nextChar, destination, written);
#endif
                }
                break;
            }
        }