in src/JetBrains.Space.Common/Json.Serialization/EnumStringConverter.cs [271:348]
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
// Note: There is no check for value == null because Json serializer won't call the converter in that case.
var rawValue = GetEnumValue(value!);
if (_rawToTransformed.TryGetValue(rawValue, out var enumInfo))
{
writer.WriteStringValue(enumInfo.Name);
return;
}
if (_isFlags)
{
ulong calculatedValue = 0;
var builder = new StringBuilder();
foreach (var enumItem in _rawToTransformed)
{
enumInfo = enumItem.Value;
if (!(value as Enum)!.HasFlag(enumInfo.EnumValue)
|| enumInfo.RawValue == 0) // Definitions with 'None' should hit the cache case.
{
continue;
}
// Track the value to make sure all bits are represented.
calculatedValue |= enumInfo.RawValue;
if (builder.Length > 0)
{
builder.Append(", ");
}
builder.Append(enumInfo.Name);
}
if (calculatedValue == rawValue)
{
writer.WriteStringValue(builder.ToString());
return;
}
}
if (!_allowIntegerValues)
{
throw new JsonException(
$"Enum type {_enumType} does not have a mapping for integer value '{rawValue.ToString(CultureInfo.CurrentCulture)}'.");
}
switch (_enumTypeCode)
{
case TypeCode.Int32:
writer.WriteNumberValue((int)rawValue);
break;
case TypeCode.Int64:
writer.WriteNumberValue((long)rawValue);
break;
case TypeCode.Int16:
writer.WriteNumberValue((short)rawValue);
break;
case TypeCode.Byte:
writer.WriteNumberValue((byte)rawValue);
break;
case TypeCode.UInt32:
writer.WriteNumberValue((uint)rawValue);
break;
case TypeCode.UInt64:
writer.WriteNumberValue(rawValue);
break;
case TypeCode.UInt16:
writer.WriteNumberValue((ushort)rawValue);
break;
case TypeCode.SByte:
writer.WriteNumberValue((sbyte)rawValue);
break;
default:
throw new JsonException(); // GetEnumValue should have already thrown.
}
}