< Summary

Information
Class: Elsa.Workflows.Serialization.Converters.InputJsonConverter<T>
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs
Line coverage
82%
Covered lines: 34
Uncovered lines: 7
Coverable lines: 41
Total lines: 93
Line coverage: 82.9%
Branch coverage
76%
Covered branches: 26
Total branches: 34
Branch coverage: 76.4%
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%210%
Read(...)76.92%312680%
Write(...)62.5%8888.23%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Serialization/Converters/InputJsonConverter.cs

#LineLine coverage
 1using System.Diagnostics.CodeAnalysis;
 2using System.Text.Json;
 3using System.Text.Json.Serialization;
 4using Elsa.Expressions.Contracts;
 5using Elsa.Expressions.Helpers;
 6using Elsa.Expressions.Models;
 7using Elsa.Workflows.Models;
 8
 9namespace Elsa.Workflows.Serialization.Converters;
 10
 11/// <summary>
 12/// Serializes <see cref="Input"/> objects.
 13/// </summary>
 14public class InputJsonConverter<T> : JsonConverter<Input<T>>
 15{
 16    private readonly IExpressionDescriptorRegistry _expressionDescriptorRegistry;
 17
 18    /// <inheritdoc />
 1260919    public InputJsonConverter(IExpressionDescriptorRegistry expressionDescriptorRegistry)
 20    {
 1260921        _expressionDescriptorRegistry = expressionDescriptorRegistry;
 1260922    }
 23
 24    /// <inheritdoc />
 025    public override bool CanConvert(Type typeToConvert) => typeof(Input).IsAssignableFrom(typeToConvert);
 26
 27    /// <inheritdoc />
 28    [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require
 29    public override Input<T> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 30    {
 341731        if (!JsonDocument.TryParseValue(ref reader, out var doc))
 032            return default!;
 33
 34        // If the value is an object, it represents an Input-wrapped property.
 341735        if (doc.RootElement.ValueKind == JsonValueKind.Object)
 36        {
 341737            if (!doc.RootElement.TryGetProperty("typeName", out _))
 038                return default!;
 39
 341740            var expressionElement = doc.RootElement.TryGetProperty("expression", out var expressionElementValue) ? expre
 341741            var expressionTypeNameElement = expressionElement.ValueKind != JsonValueKind.Undefined ? expressionElement.T
 341742            var expressionTypeName = expressionTypeNameElement.ValueKind != JsonValueKind.Undefined ? expressionTypeName
 341743            var expressionDescriptor = expressionTypeName != null ? _expressionDescriptorRegistry.Find(expressionTypeNam
 341744            var memoryBlockReference = expressionDescriptor?.MemoryBlockReferenceFactory?.Invoke();
 45
 341746            if (memoryBlockReference == null)
 47            {
 48                // No expression type means an empty Input, not an unknown syntax.
 249                if (string.IsNullOrEmpty(expressionTypeName))
 150                    return default!;
 51
 152                throw new JsonException($"Could not find an expression descriptor for expression type '{expressionTypeNa
 53            }
 54
 341555            var memoryBlockType = memoryBlockReference.GetType();
 341556            var context = new ExpressionSerializationContext(expressionTypeName!, expressionElement, options, memoryBloc
 341557            var expression = expressionDescriptor!.Deserialize(context);
 341558            return (Input<T>)Activator.CreateInstance(typeof(Input<T>), expression, memoryBlockReference)!;
 59        }
 60
 061        var convertedValue = doc.RootElement.ToString().TryConvertTo<T>().Value;
 062        return (Input<T>)Activator.CreateInstance(typeof(Input<T>), new Literal(convertedValue))!;
 63    }
 64
 65    /// <inheritdoc />
 66    public override void Write(Utf8JsonWriter writer, Input<T> value, JsonSerializerOptions options)
 67    {
 994068        var expression = value.Expression;
 69
 994070        if (expression == null)
 71        {
 072            writer.WriteNullValue();
 073            return;
 74        }
 75
 994076        var expressionType = expression.Type;
 994077        var expressionDescriptor = expressionType != null ? _expressionDescriptorRegistry.Find(expressionType) : default
 78
 994079        if (expressionDescriptor == null)
 180            throw new JsonException($"Could not find an expression descriptor for expression type '{expressionType}'.");
 81
 993982        var targetType = value.Type;
 993983        var expressionValue = expressionDescriptor.IsSerializable ? expression : null;
 84
 993985        var model = new
 993986        {
 993987            TypeName = targetType,
 993988            Expression = expressionValue!
 993989        };
 90
 993991        JsonSerializer.Serialize(writer, model, options);
 993992    }
 93}