< Summary

Information
Class: Elsa.Workflows.Serialization.Converters.ExpressionJsonConverter
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Serialization/Converters/ExpressionJsonConverter.cs
Line coverage
88%
Covered lines: 31
Uncovered lines: 4
Coverable lines: 35
Total lines: 80
Line coverage: 88.5%
Branch coverage
80%
Covered branches: 21
Total branches: 26
Branch coverage: 80.7%
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(...)83.33%181893.33%
Write(...)62.5%8887.5%

File(s)

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

#LineLine coverage
 1using System.Text.Json;
 2using System.Text.Json.Serialization;
 3using Elsa.Expressions.Contracts;
 4using Elsa.Expressions.Models;
 5using Elsa.Workflows.Models;
 6
 7namespace Elsa.Workflows.Serialization.Converters;
 8
 9/// <summary>
 10/// Serializes <see cref="Expression"/> objects.
 11/// </summary>
 12public class ExpressionJsonConverter : JsonConverter<Expression>
 13{
 14    private readonly IExpressionDescriptorRegistry _expressionDescriptorRegistry;
 15
 16    /// <inheritdoc />
 497017    public ExpressionJsonConverter(IExpressionDescriptorRegistry expressionDescriptorRegistry)
 18    {
 497019        _expressionDescriptorRegistry = expressionDescriptorRegistry;
 497020    }
 21
 22    /// <inheritdoc />
 023    public override bool CanConvert(Type typeToConvert) => typeof(Input).IsAssignableFrom(typeToConvert);
 24
 25    /// <inheritdoc />
 26    public override Expression Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 27    {
 428        if (!JsonDocument.TryParseValue(ref reader, out var doc))
 029            return default!;
 30
 431        var expressionElement = doc.RootElement;
 432        var expressionTypeNameElement = expressionElement.TryGetProperty("type", out var expressionTypeNameElementValue)
 433        var expressionTypeName = expressionTypeNameElement.ValueKind != JsonValueKind.Undefined ? expressionTypeNameElem
 434        var expressionDescriptor = expressionTypeName != null ? _expressionDescriptorRegistry.Find(expressionTypeName) :
 435        var memoryBlockReference = expressionDescriptor?.MemoryBlockReferenceFactory?.Invoke();
 36
 437        if (memoryBlockReference == null)
 38        {
 39            // No expression type means an empty expression, not an unknown syntax.
 340            if (string.IsNullOrEmpty(expressionTypeName))
 241                return default!;
 42
 143            throw new JsonException($"Could not find an expression descriptor for expression type '{expressionTypeName}'
 44        }
 45
 146        var memoryBlockType = memoryBlockReference.GetType();
 147        var context = new ExpressionSerializationContext(expressionTypeName!, expressionElement, options, memoryBlockTyp
 148        var expression = expressionDescriptor!.Deserialize(context);
 49
 150        return expression;
 51    }
 52
 53    /// <inheritdoc />
 54    public override void Write(Utf8JsonWriter writer, Expression value, JsonSerializerOptions options)
 55    {
 898956        var expression = value;
 57
 898958        if(expression == null)
 59        {
 060            writer.WriteNullValue();
 061            return;
 62        }
 63
 898964        var expressionType = expression.Type;
 898965        var expressionDescriptor = expressionType != null ? _expressionDescriptorRegistry.Find(expressionType) : null;
 66
 898967        if (expressionDescriptor == null)
 168            throw new JsonException($"Could not find an expression descriptor for expression type '{expressionType}'.");
 69
 898870        var expressionValue = expressionDescriptor.IsSerializable ? expression.Value : null;
 71
 898872        var model = new
 898873        {
 898874            Type = expressionType,
 898875            Value = expressionValue
 898876        };
 77
 898878        JsonSerializer.Serialize(writer, model, options);
 898879    }
 80}