in src/JetBrains.Space.Common/Json.Serialization/EnumStringConverter.cs [149:269]
public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var token = reader.TokenType;
if (token == JsonTokenType.String)
{
var enumString = reader.GetString();
// Case sensitive search attempted first.
if (enumString != null && _transformedToRaw.TryGetValue(enumString, out var enumInfo))
{
return (T)Enum.ToObject(_enumType, enumInfo.RawValue);
}
if (enumString != null && _isFlags)
{
ulong calculatedValue = 0;
var flagValues = enumString.Split(", ");
foreach (var flagValue in flagValues)
{
// Case sensitive search attempted first.
if (_transformedToRaw.TryGetValue(flagValue, out enumInfo))
{
calculatedValue |= enumInfo.RawValue;
}
else
{
// Case insensitive search attempted second.
var matched = false;
foreach (var (enumKey, enumValue) in _transformedToRaw)
{
if (string.Equals(enumKey, flagValue, StringComparison.OrdinalIgnoreCase))
{
calculatedValue |= enumValue.RawValue;
matched = true;
break;
}
}
if (!matched)
{
throw new JsonException($"The JSON value '{_enumType}' could not be converted to {flagValue}.");
}
}
}
return (T)Enum.ToObject(_enumType, calculatedValue);
}
// Case insensitive search attempted second.
foreach (var (enumKey, enumValue) in _transformedToRaw)
{
if (string.Equals(enumKey, enumString, StringComparison.OrdinalIgnoreCase))
{
return (T)Enum.ToObject(_enumType, enumValue.RawValue);
}
}
throw new JsonException($"The JSON value '{_enumType}' could not be converted to {enumString}.");
}
if (token != JsonTokenType.Number || !_allowIntegerValues)
{
throw new JsonException($"The JSON value could not be converted to {_enumType}.");
}
switch (_enumTypeCode)
{
case TypeCode.Int32:
if (reader.TryGetInt32(out var int32))
{
return (T)Enum.ToObject(_enumType, int32);
}
break;
case TypeCode.Int64:
if (reader.TryGetInt64(out var int64))
{
return (T)Enum.ToObject(_enumType, int64);
}
break;
case TypeCode.Int16:
if (reader.TryGetInt16(out var int16))
{
return (T)Enum.ToObject(_enumType, int16);
}
break;
case TypeCode.Byte:
if (reader.TryGetByte(out var ubyte8))
{
return (T)Enum.ToObject(_enumType, ubyte8);
}
break;
case TypeCode.UInt32:
if (reader.TryGetUInt32(out var uint32))
{
return (T)Enum.ToObject(_enumType, uint32);
}
break;
case TypeCode.UInt64:
if (reader.TryGetUInt64(out var uint64))
{
return (T)Enum.ToObject(_enumType, uint64);
}
break;
case TypeCode.UInt16:
if (reader.TryGetUInt16(out var uint16))
{
return (T)Enum.ToObject(_enumType, uint16);
}
break;
case TypeCode.SByte:
if (reader.TryGetSByte(out var byte8))
{
return (T)Enum.ToObject(_enumType, byte8);
}
break;
}
throw new JsonException($"The JSON value could not be converted to {_enumType}.");
}