diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs index a9ee62bd..4442412f 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftEnumConverter.cs @@ -4,6 +4,27 @@ using System.Text.Json.Serialization; namespace SPTarkov.Server.Core.Utils.Json.Converters; + +public class EftEnumConverterFactory : JsonConverterFactory +{ + public override bool CanConvert(Type typeToConvert) + { + return typeToConvert.IsEnum && (typeToConvert.Namespace?.Contains("SPTarkov") ?? false); + } + + public override JsonConverter? CreateConverter( + Type typeToConvert, + JsonSerializerOptions options + ) + { + return (JsonConverter) + Activator.CreateInstance( + typeof(EftEnumConverter<>).MakeGenericType(typeToConvert) + ); + } +} + + public class EftEnumConverter : JsonConverter { private static readonly JsonSerializerOptions _options = new() diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs index 2719c05a..e8aa02e1 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EftListEnumConverter.cs @@ -3,6 +3,27 @@ using System.Text.Json.Serialization; namespace SPTarkov.Server.Core.Utils.Json.Converters; +public class EftListEnumConverterFactory : JsonConverterFactory +{ + public override bool CanConvert(Type typeToConvert) + { + return typeToConvert.IsGenericType && typeToConvert.GetGenericTypeDefinition() == typeof(List<>) && + typeToConvert.GenericTypeArguments[0].IsEnum && + (typeToConvert.GenericTypeArguments[0].Namespace?.Contains("SPTarkov") ?? false); + } + + public override JsonConverter? CreateConverter( + Type typeToConvert, + JsonSerializerOptions options + ) + { + return (JsonConverter) + Activator.CreateInstance( + typeof(EftListEnumConverter<>).MakeGenericType(typeToConvert.GenericTypeArguments[0]) + ); + } +} + public class EftListEnumConverter : JsonConverter> { private static readonly JsonSerializerOptions _options = new() diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EnumerableConverter.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EnumerableConverter.cs new file mode 100644 index 00000000..5704e64e --- /dev/null +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/EnumerableConverter.cs @@ -0,0 +1,59 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace SPTarkov.Server.Core.Utils.Json.Converters; + +public class EnumerableConverterFactory : JsonConverterFactory +{ + public override bool CanConvert(Type typeToConvert) + { + return typeToConvert.IsGenericType + && typeToConvert.GetGenericTypeDefinition() == typeof(IEnumerable<>); + } + + public override JsonConverter? CreateConverter( + Type typeToConvert, + JsonSerializerOptions options + ) + { + return (JsonConverter) + Activator.CreateInstance( + typeof(EnumerableConverter<>).MakeGenericType(typeToConvert.GenericTypeArguments[0]) + ); + } +} + +public class EnumerableConverter : JsonConverter?> +{ + public override IEnumerable? Read( + ref Utf8JsonReader reader, + Type typeToConvert, + JsonSerializerOptions options + ) + { + switch (reader.TokenType) + { + case JsonTokenType.String: + case JsonTokenType.Number: + case JsonTokenType.StartObject: + throw new Exception($"Error attempting to deserialize object, its not a valid array. Type {reader.TokenType}"); + + case JsonTokenType.StartArray: + var list = JsonSerializer.Deserialize>(ref reader, options); + return list; + default: + throw new Exception( + $"Unable to translate object type {reader.TokenType} to ListOrT." + ); + } + } + + public override void Write( + Utf8JsonWriter writer, + IEnumerable? value, + JsonSerializerOptions options + ) + { + JsonSerializer.Serialize(writer, value?.ToList(), options); + } +} diff --git a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs index 2b085b4d..26bd3ab5 100644 --- a/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs +++ b/Libraries/SPTarkov.Server.Core/Utils/Json/Converters/SptJsonConverterRegistrator.cs @@ -18,39 +18,9 @@ public class SptJsonConverterRegistrator : IJsonConverterRegistrator new EftEnumConverter(), // Special case, this belongs to a lib. new BaseInteractionRequestDataConverter(), new StringToMongoIdConverter(), - .. GetGenericJsonConverters(), + new EftEnumConverterFactory(), + new EftListEnumConverterFactory(), + new EnumerableConverterFactory() ]; } - - private static List GetGenericJsonConverters() - { - var enums = AppDomain - .CurrentDomain.GetAssemblies() - .SelectMany(assembly => assembly.GetTypes()) - .Where(type => - type.IsEnum && type.GetCustomAttribute() != null - ); - - var listEnums = AppDomain - .CurrentDomain.GetAssemblies() - .SelectMany(assembly => assembly.GetTypes()) - .Where(type => - type.IsEnum && type.GetCustomAttribute() != null - ); - - var result = enums - .Select(e => - (JsonConverter) - Activator.CreateInstance(typeof(EftEnumConverter<>).MakeGenericType(e))! - ) - .ToList(); - result.AddRange( - listEnums.Select(e => - (JsonConverter) - Activator.CreateInstance(typeof(EftListEnumConverter<>).MakeGenericType(e))! - ) - ); - - return result; - } }