< Summary - Syki

Information
Class: Syki.Back.Converters.SykiStringEnumConverter
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Converters/SykiStringEnumConverter.cs
Tag: 21_17346963026
Line coverage
50%
Covered lines: 24
Uncovered lines: 24
Coverable lines: 48
Total lines: 106
Line coverage: 50%
Branch coverage
41%
Covered branches: 20
Total branches: 48
Branch coverage: 41.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
CanConvert(...)100%44100%
CreateConverter(...)100%44100%
.ctor()100%11100%
Read(...)22.22%1041835.71%
Write(...)100%11100%
.ctor()100%11100%
Read(...)40%1012041.17%
Write(...)0%620%

File(s)

/home/runner/work/syki/syki/Back/Converters/SykiStringEnumConverter.cs

#LineLine coverage
 1using System.Text.Json;
 2using System.Text.Json.Serialization;
 3
 4namespace Syki.Back.Converters;
 5
 6public sealed class SykiStringEnumConverter : JsonConverterFactory
 7{
 48    public SykiStringEnumConverter() { }
 9
 10    public override bool CanConvert(Type typeToConvert)
 11    {
 52412        var underlying = Nullable.GetUnderlyingType(typeToConvert);
 52413        return (underlying is not null && underlying.IsEnum) || typeToConvert.IsEnum;
 14    }
 15
 16    public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
 17    {
 5618        var underlying = Nullable.GetUnderlyingType(typeToConvert);
 5619        var enumType = underlying ?? typeToConvert;
 20
 5621        var convType = underlying is null
 5622            ? typeof(EnumConverter<>).MakeGenericType(enumType)
 5623            : typeof(NullableEnumConverter<>).MakeGenericType(enumType);
 24
 5625        return (JsonConverter)Activator.CreateInstance(convType)!;
 26    }
 27
 28    private sealed class EnumConverter<TEnum> : JsonConverter<TEnum> where TEnum : struct, Enum
 29    {
 10030        public EnumConverter() { }
 31
 32        public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 33        {
 243434            if (reader.TokenType == JsonTokenType.String)
 35            {
 036                var s = reader.GetString();
 037                if (!string.IsNullOrWhiteSpace(s) &&
 038                    Enum.TryParse<TEnum>(s, ignoreCase: true, out var parsed) &&
 039                    Enum.IsDefined(parsed))
 040                    return parsed;
 41
 042                if (int.TryParse(s, out var n) &&
 043                    Enum.IsDefined(typeof(TEnum), n))
 044                    return (TEnum)Enum.ToObject(typeof(TEnum), n);
 45            }
 243446            else if (reader.TokenType == JsonTokenType.Number &&
 243447                    reader.TryGetInt32(out var value) &&
 243448                    Enum.IsDefined(typeof(TEnum), value))
 49            {
 243450                return (TEnum)Enum.ToObject(typeof(TEnum), value);
 51            }
 52
 053            throw new JsonException($"The JSON value could not be converted to {typeof(TEnum).FullName}.");
 54        }
 55
 56        public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options)
 2309857            => writer.WriteStringValue(value.ToString());
 58    }
 59
 60    private sealed class NullableEnumConverter<TEnum> : JsonConverter<TEnum?> where TEnum : struct, Enum
 61    {
 1262        public NullableEnumConverter() { }
 63
 64        public override TEnum? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 65        {
 153066            if (reader.TokenType == JsonTokenType.Null)
 067                return null;
 68
 153069            if (reader.TokenType == JsonTokenType.String)
 70            {
 071                var str = reader.GetString();
 072                if (str.IsEmpty()) return null;
 73
 074                if (Enum.TryParse<TEnum>(str, ignoreCase: true, out var parsed) &&
 075                    Enum.IsDefined(parsed))
 076                    return parsed;
 77
 078                if (int.TryParse(str, out var n) &&
 079                    Enum.IsDefined(typeof(TEnum), n))
 080                    return (TEnum)Enum.ToObject(typeof(TEnum), n);
 81
 082                return null;
 83            }
 84
 153085            if (reader.TokenType == JsonTokenType.Number &&
 153086                reader.TryGetInt32(out var value) &&
 153087                Enum.IsDefined(typeof(TEnum), value))
 88            {
 152289                return (TEnum)Enum.ToObject(typeof(TEnum), value);
 90            }
 91
 892            return null;
 93        }
 94
 95        public override void Write(Utf8JsonWriter writer, TEnum? value, JsonSerializerOptions options)
 96        {
 097            if (value is null)
 98            {
 099                writer.WriteNullValue();
 0100                return;
 101            }
 102
 0103            writer.WriteStringValue(value.Value.ToString());
 0104        }
 105    }
 106}