JsonValueOfJsonPrimitive
using System.Buffers;
using System.Buffers.Text;
using System.Diagnostics.CodeAnalysis;
namespace System.Text.Json.Nodes
{
internal static class JsonValueOfJsonPrimitive
{
private sealed class JsonValueOfJsonString : JsonValue
{
private readonly ReadOnlyMemory<byte> _value;
internal JsonValueOfJsonString(ReadOnlyMemory<byte> utf8String, JsonNodeOptions? options)
: base(options)
{
_value = utf8String;
}
internal override JsonNode DeepCloneCore()
{
return new JsonValueOfJsonString(_value, base.Options);
}
private protected override JsonValueKind GetValueKindCore()
{
return JsonValueKind.String;
}
public override void WriteTo(Utf8JsonWriter writer, JsonSerializerOptions options = null)
{
System.ExceptionPolyfills.ThrowIfNull(writer, "writer");
writer.WriteStringValue(_value.Span);
}
public override T GetValue<T>()
{
if (!TryGetValue(out T value))
ThrowHelper.ThrowInvalidOperationException_NodeUnableToConvertElement(JsonValueKind.String, typeof(T));
return value;
}
public override bool TryGetValue<T>([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value)
{
if (typeof(T) == typeof(JsonElement)) {
value = (T)(object)JsonWriterHelper.WriteString(_value.Span, (ReadOnlySpan<byte> serialized) => JsonElement.Parse(serialized, default(JsonDocumentOptions)));
return true;
}
if (typeof(T) == typeof(string)) {
string text = JsonReaderHelper.TranscodeHelper(_value.Span);
value = (T)(object)text;
return true;
}
if (typeof(T) == typeof(DateTime) || typeof(T) == typeof(DateTime?)) {
DateTime value2;
bool result = JsonReaderHelper.TryGetValue(_value.Span, false, out value2);
value = (T)(object)value2;
return result;
}
if (typeof(T) == typeof(DateTimeOffset) || typeof(T) == typeof(DateTimeOffset?)) {
DateTimeOffset value3;
bool result2 = JsonReaderHelper.TryGetValue(_value.Span, false, out value3);
value = (T)(object)value3;
return result2;
}
if (typeof(T) == typeof(Guid) || typeof(T) == typeof(Guid?)) {
Guid value4;
bool result3 = JsonReaderHelper.TryGetValue(_value.Span, false, out value4);
value = (T)(object)value4;
return result3;
}
if (typeof(T) == typeof(char) || typeof(T) == typeof(char?)) {
string text2 = JsonReaderHelper.TranscodeHelper(_value.Span);
if (text2.Length == 1) {
value = (T)(object)text2[0];
return true;
}
}
value = default(T);
return false;
}
}
private sealed class JsonValueOfJsonBool : JsonValue
{
private readonly bool _value;
private JsonValueKind ValueKind {
get {
if (!_value)
return JsonValueKind.False;
return JsonValueKind.True;
}
}
internal JsonValueOfJsonBool(bool value, JsonNodeOptions? options)
: base(options)
{
_value = value;
}
public override void WriteTo(Utf8JsonWriter writer, JsonSerializerOptions options = null)
{
writer.WriteBooleanValue(_value);
}
internal override JsonNode DeepCloneCore()
{
return new JsonValueOfJsonBool(_value, base.Options);
}
private protected override JsonValueKind GetValueKindCore()
{
return ValueKind;
}
public override T GetValue<T>()
{
if (!TryGetValue(out T value))
ThrowHelper.ThrowInvalidOperationException_NodeUnableToConvertElement(_value ? JsonValueKind.True : JsonValueKind.False, typeof(T));
return value;
}
public override bool TryGetValue<T>([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value)
{
if (typeof(T) == typeof(JsonElement)) {
value = (T)(object)JsonElement.Parse(_value ? JsonConstants.TrueValue : JsonConstants.FalseValue, default(JsonDocumentOptions));
return true;
}
if (typeof(T) == typeof(bool) || typeof(T) == typeof(bool?)) {
value = (T)(object)_value;
return true;
}
value = default(T);
return false;
}
}
private sealed class JsonValueOfJsonNumber : JsonValue
{
private readonly byte[] _value;
internal JsonValueOfJsonNumber(byte[] number, JsonNodeOptions? options)
: base(options)
{
_value = number;
}
internal override JsonNode DeepCloneCore()
{
return new JsonValueOfJsonNumber(_value, base.Options);
}
private protected override JsonValueKind GetValueKindCore()
{
return JsonValueKind.Number;
}
public override T GetValue<T>()
{
if (!TryGetValue(out T value))
ThrowHelper.ThrowInvalidOperationException_NodeUnableToConvertElement(JsonValueKind.Number, typeof(T));
return value;
}
public override bool TryGetValue<T>([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out T value)
{
if (typeof(T) == typeof(JsonElement)) {
value = (T)(object)JsonElement.Parse(_value, default(JsonDocumentOptions));
return true;
}
if (typeof(T) == typeof(int) || typeof(T) == typeof(int?)) {
int value2;
int bytesConsumed;
bool result = Utf8Parser.TryParse(_value, out value2, out bytesConsumed, ' ') && bytesConsumed == _value.Length;
value = (T)(object)value2;
return result;
}
if (typeof(T) == typeof(long) || typeof(T) == typeof(long?)) {
long value3;
int bytesConsumed2;
bool result2 = Utf8Parser.TryParse(_value, out value3, out bytesConsumed2, ' ') && bytesConsumed2 == _value.Length;
value = (T)(object)value3;
return result2;
}
if (typeof(T) == typeof(double) || typeof(T) == typeof(double?)) {
double value4;
int bytesConsumed3;
bool result3 = Utf8Parser.TryParse(_value, out value4, out bytesConsumed3, ' ') && bytesConsumed3 == _value.Length;
value = (T)(object)value4;
return result3;
}
if (typeof(T) == typeof(short) || typeof(T) == typeof(short?)) {
short value5;
int bytesConsumed4;
bool result4 = Utf8Parser.TryParse(_value, out value5, out bytesConsumed4, ' ') && bytesConsumed4 == _value.Length;
value = (T)(object)value5;
return result4;
}
if (typeof(T) == typeof(decimal) || typeof(T) == typeof(decimal?)) {
decimal value6;
int bytesConsumed5;
bool result5 = Utf8Parser.TryParse(_value, out value6, out bytesConsumed5, ' ') && bytesConsumed5 == _value.Length;
value = (T)(object)value6;
return result5;
}
if (typeof(T) == typeof(byte) || typeof(T) == typeof(byte?)) {
byte value7;
int bytesConsumed6;
bool result6 = Utf8Parser.TryParse(_value, out value7, out bytesConsumed6, ' ') && bytesConsumed6 == _value.Length;
value = (T)(object)value7;
return result6;
}
if (typeof(T) == typeof(float) || typeof(T) == typeof(float?)) {
float value8;
int bytesConsumed7;
bool result7 = Utf8Parser.TryParse(_value, out value8, out bytesConsumed7, ' ') && bytesConsumed7 == _value.Length;
value = (T)(object)value8;
return result7;
}
if (typeof(T) == typeof(uint) || typeof(T) == typeof(uint?)) {
uint value9;
int bytesConsumed8;
bool result8 = Utf8Parser.TryParse(_value, out value9, out bytesConsumed8, ' ') && bytesConsumed8 == _value.Length;
value = (T)(object)value9;
return result8;
}
if (typeof(T) == typeof(ushort) || typeof(T) == typeof(ushort?)) {
ushort value10;
int bytesConsumed9;
bool result9 = Utf8Parser.TryParse(_value, out value10, out bytesConsumed9, ' ') && bytesConsumed9 == _value.Length;
value = (T)(object)value10;
return result9;
}
if (typeof(T) == typeof(ulong) || typeof(T) == typeof(ulong?)) {
ulong value11;
int bytesConsumed10;
bool result10 = Utf8Parser.TryParse(_value, out value11, out bytesConsumed10, ' ') && bytesConsumed10 == _value.Length;
value = (T)(object)value11;
return result10;
}
if (typeof(T) == typeof(sbyte) || typeof(T) == typeof(sbyte?)) {
sbyte value12;
int bytesConsumed11;
bool result11 = Utf8Parser.TryParse(_value, out value12, out bytesConsumed11, ' ') && bytesConsumed11 == _value.Length;
value = (T)(object)value12;
return result11;
}
value = default(T);
return false;
}
public override void WriteTo(Utf8JsonWriter writer, JsonSerializerOptions options = null)
{
System.ExceptionPolyfills.ThrowIfNull(writer, "writer");
writer.WriteNumberValue(_value);
}
}
internal static JsonValue CreatePrimitiveValue(ref Utf8JsonReader reader, JsonNodeOptions options)
{
switch (reader.TokenType) {
case JsonTokenType.True:
case JsonTokenType.False:
return new JsonValueOfJsonBool(reader.GetBoolean(), options);
case JsonTokenType.String: {
byte[] array = new byte[reader.ValueLength];
return new JsonValueOfJsonString(MemoryExtensions.AsMemory(array, 0, reader.CopyString(array)), options);
}
case JsonTokenType.Number: {
object number;
if (!reader.HasValueSequence)
number = reader.ValueSpan.ToArray();
else {
ReadOnlySequence<byte> sequence = reader.ValueSequence;
number = ref sequence.ToArray();
}
return new JsonValueOfJsonNumber((byte[])number, options);
}
default:
ThrowHelper.ThrowJsonException(null);
return null;
}
}
}
}