using System;
using Utf8Json.Internal;
using System.Reflection;
using Utf8Json.Formatters;
using Utf8Json.Resolvers.Internal;
namespace Utf8Json.Resolvers
{
public static class EnumResolver
{
/// Serialize as Name.
public static readonly IJsonFormatterResolver Default = EnumDefaultResolver.Instance;
/// Serialize as Value.
public static readonly IJsonFormatterResolver UnderlyingValue = EnumUnderlyingValueResolver.Instance;
}
}
namespace Utf8Json.Resolvers.Internal
{
internal sealed class EnumDefaultResolver : IJsonFormatterResolver
{
public static readonly IJsonFormatterResolver Instance = new EnumDefaultResolver();
EnumDefaultResolver()
{
}
public IJsonFormatter GetFormatter()
{
return FormatterCache.formatter;
}
static class FormatterCache
{
public static readonly IJsonFormatter formatter;
static FormatterCache()
{
var ti = typeof(T).GetTypeInfo();
if (ti.IsNullable())
{
// build underlying type and use wrapped formatter.
ti = ti.GenericTypeArguments[0].GetTypeInfo();
if (!ti.IsEnum)
{
return;
}
var innerFormatter = Instance.GetFormatterDynamic(ti.AsType());
if (innerFormatter == null)
{
return;
}
formatter = (IJsonFormatter)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter });
return;
}
else if (typeof(T).IsEnum)
{
formatter = (IJsonFormatter)(object)new EnumFormatter(true);
}
}
}
}
internal sealed class EnumUnderlyingValueResolver : IJsonFormatterResolver
{
public static readonly IJsonFormatterResolver Instance = new EnumUnderlyingValueResolver();
EnumUnderlyingValueResolver()
{
}
public IJsonFormatter GetFormatter()
{
return FormatterCache.formatter;
}
static class FormatterCache
{
public static readonly IJsonFormatter formatter;
static FormatterCache()
{
var ti = typeof(T).GetTypeInfo();
if (ti.IsNullable())
{
// build underlying type and use wrapped formatter.
ti = ti.GenericTypeArguments[0].GetTypeInfo();
if (!ti.IsEnum)
{
return;
}
var innerFormatter = Instance.GetFormatterDynamic(ti.AsType());
if (innerFormatter == null)
{
return;
}
formatter = (IJsonFormatter)Activator.CreateInstance(typeof(StaticNullableFormatter<>).MakeGenericType(ti.AsType()), new object[] { innerFormatter });
return;
}
else if (typeof(T).IsEnum)
{
formatter = (IJsonFormatter)(object)new EnumFormatter(false);
}
}
}
}
}