public override T Read()

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}.");
	}