< Summary - pva.SuperV

Information
Class: pva.SuperV.Engine.JsonConverters.FieldValueProcessingJsonConverter
Assembly: pva.SuperV.Engine
File(s): /home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Engine/JsonConverters/FieldValueProcessingJsonConverter.cs
Tag: dotnet-ubuntu_18869653307
Line coverage
98%
Covered lines: 68
Uncovered lines: 1
Coverable lines: 69
Total lines: 134
Line coverage: 98.5%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
Read(...)100%11100%
ReadParameters(...)83.33%6695.45%
Write(...)100%11100%
WriteCtorParameters(...)100%44100%
CreateInstance(...)100%11100%
GetConstructor(...)50%22100%

File(s)

/home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Engine/JsonConverters/FieldValueProcessingJsonConverter.cs

#LineLine coverage
 1using pva.SuperV.Engine.Processing;
 2using System.Reflection;
 3using System.Text.Json;
 4using System.Text.Json.Serialization;
 5
 6namespace pva.SuperV.Engine.JsonConverters
 7{
 8    /// <summary>
 9    /// Json converter for field value processing
 10    /// </summary>
 11    /// <seealso cref="JsonConverter{IFieldValueProcessing}" />
 12    public class FieldValueProcessingJsonConverter : JsonConverter<IFieldValueProcessing>
 13    {
 14        /// <summary>
 15        /// The field converters cache.
 16        /// </summary>
 217        private static readonly Dictionary<Type, dynamic> ArgConvertersCache = [];
 18
 19        /// <summary>
 20        /// Reads and converts the JSON to type.
 21        /// </summary>
 22        /// <param name="reader">The reader.</param>
 23        /// <param name="typeToConvert">The type to convert.</param>
 24        /// <param name="options">An object that specifies serialization options to use.</param>
 25        /// <returns>
 26        /// The converted value.
 27        /// </returns>
 28        /// <exception cref="JsonException"></exception>
 29        public override IFieldValueProcessing Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions 
 330        {
 331            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.StartObject, false);
 32
 333            string? fieldValueProcessingTypeString = JsonHelpers.GetStringPropertyFromUtfReader(ref reader, "Type");
 334            string? fieldValueProcessingName = JsonHelpers.GetStringPropertyFromUtfReader(ref reader, "Name");
 35
 336            List<object> ctorArguments = ReadParameters(ref reader, options);
 337            Type? fieldType = Type.GetType(fieldValueProcessingTypeString!);
 38
 339            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.EndObject);
 40
 341            IFieldValueProcessing fieldValueProcessing = CreateInstance(fieldType!);
 342            fieldValueProcessing.Name = fieldValueProcessingName!;
 343            fieldValueProcessing.CtorArguments = ctorArguments;
 344            return fieldValueProcessing;
 345        }
 46
 47        private static List<object> ReadParameters(ref Utf8JsonReader reader, JsonSerializerOptions options)
 348        {
 349            List<object> ctorArguments = [];
 350            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.PropertyName);
 351            JsonHelpers.ReadPropertyName(ref reader, "Params");
 52
 353            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.StartArray);
 3254            while (reader.Read())
 3255            {
 3256                if (reader.TokenType == JsonTokenType.EndArray)
 357                {
 358                    return ctorArguments;
 59                }
 2960                JsonHelpers.ReadTokenType(ref reader, JsonTokenType.StartObject, false);
 2961                string? paramTypeString = JsonHelpers.GetStringPropertyFromUtfReader(ref reader, "Type");
 62
 2963                JsonHelpers.ReadTokenType(ref reader, JsonTokenType.PropertyName);
 2964                JsonHelpers.ReadPropertyName(ref reader, "Value");
 65
 2966                reader.Read();
 2967                Type? paramType = Type.GetType(paramTypeString!);
 2968                dynamic? argValue = JsonSerializer.Deserialize(ref reader, paramType!, options);
 2969                JsonHelpers.ReadTokenType(ref reader, JsonTokenType.EndObject);
 2970                ctorArguments.Add(argValue);
 2971            }
 072            return ctorArguments;
 373        }
 74
 75        /// <summary>
 76        /// Writes the specified writer.
 77        /// </summary>
 78        /// <param name="writer">The writer.</param>
 79        /// <param name="fieldValueProcessing">The field processing.</param>
 80        /// <param name="options">The options.</param>
 81        public override void Write(Utf8JsonWriter writer, IFieldValueProcessing fieldValueProcessing, JsonSerializerOpti
 682        {
 683            writer.WriteStartObject();
 684            writer.WriteString("Type", fieldValueProcessing.GetType().ToString());
 685            writer.WriteString("Name", fieldValueProcessing.Name);
 686            WriteCtorParameters(writer, fieldValueProcessing, options);
 687            writer.WriteEndObject();
 688        }
 89
 90        private static void WriteCtorParameters(Utf8JsonWriter writer, IFieldValueProcessing fieldValueProcessing, JsonS
 691        {
 692            writer.WriteStartArray("Params");
 693            fieldValueProcessing.CtorArguments.ForEach(arg =>
 5894                {
 5895                    Type argType = arg.GetType();
 5896                    writer.WriteStartObject();
 5897                    writer.WriteString("Type", argType.ToString());
 5898                    if (!ArgConvertersCache.TryGetValue(argType, out dynamic? argConverter))
 299                    {
 2100                        argConverter = JsonSerializerOptions.Default.GetConverter(argType);
 2101                        ArgConvertersCache.Add(argType, argConverter);
 2102                    }
 58103                    writer.WritePropertyName("Value");
 58104                    JsonSerializer.Serialize(writer, arg, options);
 58105                    writer.WriteEndObject();
 64106                });
 6107            writer.WriteEndArray();
 6108        }
 109
 110        /// <summary>
 111        /// Creates an instance for targetType's <see cref="FieldValueProcessing{T}"/>.
 112        /// </summary>
 113        /// <param name="targetType">Type of the target.</param>
 114        /// <returns><see cref="IFieldValueProcessing"/> created instance.</returns>
 115        private static IFieldValueProcessing CreateInstance(Type targetType)
 3116        {
 3117            var ctor = GetConstructor(targetType);
 3118            return (IFieldValueProcessing)ctor.Invoke([]);
 3119        }
 120
 121        /// <summary>
 122        /// Gets the constructor for targetType's <see cref="FieldValueProcessing{T}"/>.
 123        /// </summary>
 124        /// <param name="fieldProcesingType">Type of the target.</param>
 125        /// <returns></returns>
 126        /// <exception cref="InvalidOperationException">No constructor found for FieldValueProcessing{targetType.Name}.<
 127        private static ConstructorInfo GetConstructor(Type fieldProcesingType)
 3128        {
 3129            return fieldProcesingType
 3130                .GetConstructor([])
 3131                ?? throw new InvalidOperationException($"No constructor found for {fieldProcesingType.Name}.");
 3132        }
 133    }
 134}