#nullable enable
using System;
using System.Text.Json;
using System.Text.Json.Serialization;

namespace Ryujinx.Common.Utilities
{
    /// <summary>
    /// Specifies that value of <see cref="TEnum"/> will be serialized as string in JSONs
    /// </summary>
    /// <remarks>
    /// Trimming friendly alternative to <see cref="JsonStringEnumConverter"/>.
    /// Get rid of this converter if dotnet supports similar functionality out of the box.
    /// </remarks>
    /// <typeparam name="TEnum">Type of enum to serialize</typeparam>
    public sealed class TypedStringEnumConverter<TEnum> : JsonConverter<TEnum> where TEnum : struct, Enum
    {
        public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            var enumValue = reader.GetString();
            if (string.IsNullOrEmpty(enumValue))
            {
                return default;
            }

            return Enum.Parse<TEnum>(enumValue);
        }

        public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString());
        }
    }
}