// Copyright (C) 2025 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
using System;
using System.Linq;
using System.Reflection;
namespace QtVsTools.Json
{
///
/// Provide serialization/deserialization of enum values marked with the [EnumString] attribute
///
public static class SerializableEnum
{
public static string Serialize(TEnum enumValue)
where TEnum : struct
{
var type = enumValue.GetType();
if (!type.IsEnum)
return enumValue.ToString();
var member = type.GetMember(enumValue.ToString());
if (member.Length == 0)
return enumValue.ToString();
var attribs = member[0].GetCustomAttributes(typeof(EnumStringAttribute), false);
if (attribs.Length == 0)
return enumValue.ToString();
if (attribs.FirstOrDefault(x => x is EnumStringAttribute) is EnumStringAttribute a)
return a.ValueString;
return enumValue.ToString();
}
public static TEnum Deserialize(string stringValue)
where TEnum : struct
{
if (!typeof(TEnum).IsEnum)
return default;
var members = typeof(TEnum).GetMembers();
if (members.Length == 0)
return default;
var member = members.Where(x =>
{
var attribs = x.GetCustomAttributes(typeof(EnumStringAttribute), false);
if (attribs.Length == 0)
return false;
if (attribs.FirstOrDefault(y => y is EnumStringAttribute) is EnumStringAttribute a)
return a.ValueString == stringValue;
return false;
}).FirstOrDefault();
var field = member as FieldInfo;
if (field == null)
return default;
var objValue = field.GetValue(null);
return objValue is not TEnum value ? default : value;
}
}
public class EnumStringAttribute : Attribute
{
public string ValueString { get; }
public EnumStringAttribute(string enumValueString)
{
ValueString = enumValueString;
}
}
}