< Summary - pva.SuperV

Information
Class: pva.SuperV.Engine.JsonConverters.FieldDefinitionJsonConverter
Assembly: pva.SuperV.Engine
File(s): /home/runner/work/pva.SuperV/pva.SuperV/pva.SuperV.Engine/JsonConverters/FieldDefinitionJsonConverter.cs
Tag: dotnet-ubuntu_18869653307
Line coverage
96%
Covered lines: 58
Uncovered lines: 2
Coverable lines: 60
Total lines: 126
Line coverage: 96.6%
Branch coverage
91%
Covered branches: 22
Total branches: 24
Branch coverage: 91.6%
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(...)87.5%8892.59%
Write(...)100%1414100%
CreateInstance(...)100%11100%
GetConstructor(...)50%22100%

File(s)

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

#LineLine coverage
 1using pva.SuperV.Engine.FieldFormatters;
 2using pva.SuperV.Engine.Processing;
 3using System.Reflection;
 4using System.Text.Json;
 5using System.Text.Json.Serialization;
 6
 7namespace pva.SuperV.Engine.JsonConverters
 8{
 9    /// <summary>
 10    /// Json converter for field definition
 11    /// </summary>
 12    /// <seealso cref="JsonConverter&lt;IFieldDefinition&gt;" />
 13    public class FieldDefinitionJsonConverter : JsonConverter<IFieldDefinition>
 14    {
 15        /// <summary>
 16        /// The field converters cache.
 17        /// </summary>
 218        private static readonly Dictionary<Type, dynamic> FieldConvertersCache = [];
 19
 20        /// <summary>
 21        /// Reads and converts the JSON to type.
 22        /// </summary>
 23        /// <param name="reader">The reader.</param>
 24        /// <param name="typeToConvert">The type to convert.</param>
 25        /// <param name="options">An object that specifies serialization options to use.</param>
 26        /// <returns>
 27        /// The converted value.
 28        /// </returns>
 29        /// <exception cref="JsonException"></exception>
 30        public override IFieldDefinition Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions optio
 3331        {
 3332            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.StartObject, false);
 3333            string? fieldTypeString = JsonHelpers.GetStringPropertyFromUtfReader(ref reader, "Type");
 3334            string? fieldName = JsonHelpers.GetStringPropertyFromUtfReader(ref reader, "Name");
 35
 3336            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.PropertyName);
 3337            JsonHelpers.ReadPropertyName(ref reader, "DefaultValue");
 38
 3339            Type? fieldType = Type.GetType(fieldTypeString!);
 3340            dynamic? defaultValue = JsonSerializer.Deserialize(ref reader, fieldType!, options);
 3341            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.PropertyName);
 3342            JsonHelpers.ReadPropertyName(ref reader, "ValuePostChangeProcessings");
 3343            List<IFieldValueProcessing>? fieldValueProcessings = JsonSerializer.Deserialize<List<IFieldValueProcessing>>
 44
 3345            FieldFormatter? fieldFormatter = null;
 3346            reader.Read();
 3347            if (reader.TokenType == JsonTokenType.PropertyName)
 248            {
 249                if (reader.GetString() != "Formatter")
 050                {
 051                    throw new JsonException();
 52                }
 253                fieldFormatter = JsonSerializer.Deserialize<FieldFormatter>(ref reader, options);
 254                reader.Read();
 255            }
 56
 3357            JsonHelpers.ReadTokenType(ref reader, JsonTokenType.EndObject, false);
 58
 3359            IFieldDefinition fieldDefinition = CreateInstance(fieldType!, fieldName, defaultValue);
 3360            fieldDefinition.ValuePostChangeProcessings = fieldValueProcessings!;
 3361            fieldDefinition.Formatter = fieldFormatter;
 3362            return fieldDefinition;
 3363        }
 64
 65        /// <summary>
 66        /// Writes the specified writer.
 67        /// </summary>
 68        /// <param name="writer">The writer.</param>
 69        /// <param name="fieldDefinition">The field definition.</param>
 70        /// <param name="options">The options.</param>
 71        public override void Write(Utf8JsonWriter writer, IFieldDefinition fieldDefinition, JsonSerializerOptions option
 5272        {
 5273            writer.WriteStartObject();
 74
 5275            writer.WriteString("Type", fieldDefinition.Type.ToString());
 5276            writer.WriteString("Name", fieldDefinition.Name);
 5277            dynamic actualFieldDefinition = fieldDefinition;
 5278            Type fieldType = actualFieldDefinition.Type;
 5279            if (!FieldConvertersCache.TryGetValue(fieldType, out dynamic? fieldConverter))
 2480            {
 2481                fieldConverter = JsonSerializerOptions.Default.GetConverter(fieldType);
 2482                FieldConvertersCache.Add(fieldType, fieldConverter);
 2483            }
 5284            writer.WritePropertyName("DefaultValue");
 5285            fieldConverter.Write(writer, actualFieldDefinition.DefaultValue, options);
 86
 5287            writer.WritePropertyName("ValuePostChangeProcessings");
 5288            JsonSerializer.Serialize(writer, fieldDefinition.ValuePostChangeProcessings, options);
 89
 5290            if (fieldDefinition!.Formatter is not null)
 491            {
 492                writer.WritePropertyName("Formatter");
 493                JsonSerializer.Serialize(writer, fieldDefinition.Formatter, options);
 494            }
 5295            writer.WriteEndObject();
 5296        }
 97
 98        /// <summary>
 99        /// Creates an instance for targetType's <see cref="FieldDefinition{T}"/>.
 100        /// </summary>
 101        /// <param name="targetType">Type of the target.</param>
 102        /// <param name="fieldName">Name of the field.</param>
 103        /// <param name="value">The value.</param>
 104        /// <returns><see cref="IFieldDefinition"/> created instance.</returns>
 105        private static IFieldDefinition CreateInstance(Type targetType, string fieldName, object value)
 33106        {
 33107            var ctor = GetConstructor(targetType, targetType);
 33108            return (IFieldDefinition)ctor.Invoke([fieldName, value]);
 33109        }
 110
 111        /// <summary>
 112        /// Gets the constructor for targetType's <see cref="FieldDefinition{T}"/>.
 113        /// </summary>
 114        /// <param name="targetType">Type of the target.</param>
 115        /// <param name="argumentType">Type of the argument.</param>
 116        /// <returns></returns>
 117        /// <exception cref="InvalidOperationException">No constructor found for FieldDefinition{targetType.Name}.</exce
 118        private static ConstructorInfo GetConstructor(Type targetType, Type argumentType)
 33119        {
 33120            return typeof(FieldDefinition<>)
 33121                .MakeGenericType(targetType)
 33122                .GetConstructor([typeof(string), argumentType])
 33123                ?? throw new InvalidOperationException($"No constructor found for FieldDefinition<{targetType.Name}>.");
 33124        }
 125    }
 126}