public override void Write()

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.
		}
	}