< Summary

Information
Class: Elsa.Workflows.Activities.Flowchart.Serialization.ConnectionJsonConverter
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Serialization/ConnectionJsonConverter.cs
Line coverage
77%
Covered lines: 45
Uncovered lines: 13
Coverable lines: 58
Total lines: 110
Line coverage: 77.5%
Branch coverage
44%
Covered branches: 15
Total branches: 34
Branch coverage: 44.1%
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%11100%
Read(...)50%201882.6%
Get()25%9433.33%
GetId()50%3250%
GetPort()25%6450%
Write(...)50%6694.44%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Activities/Flowchart/Serialization/ConnectionJsonConverter.cs

#LineLine coverage
 1using System.Text.Json;
 2using System.Text.Json.Serialization;
 3using Elsa.Workflows.Activities.Flowchart.Models;
 4using Microsoft.Extensions.Logging;
 5
 6namespace Elsa.Workflows.Activities.Flowchart.Serialization;
 7
 8/// <summary>
 9/// Converts <see cref="Connection"/> to and from JSON.
 10/// </summary>
 317111public class ConnectionJsonConverter(IDictionary<string, IActivity> activities, ILoggerFactory loggerFactory) : JsonConv
 12{
 317113    private readonly ILogger _logger = loggerFactory.CreateLogger<ConnectionJsonConverter>();
 14
 15    /// <inheritdoc />
 12512116    public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(Connection);
 17
 18    /// <inheritdoc />
 19    public override Connection? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
 20    {
 70321        if (!JsonDocument.TryParseValue(ref reader, out var doc))
 022            throw new JsonException("Failed to parse JsonDocument");
 23
 70324        var root = doc.RootElement;
 25
 26        // case‐insensitive get
 27        JsonElement Get(string name)
 28        {
 140629            if (root.TryGetProperty(name, out var e))
 140630                return e;
 031            var alt = char.ToUpperInvariant(name[0]) + name.Substring(1);
 032            if (root.TryGetProperty(alt, out e))
 033                return e;
 034            throw new JsonException($"Missing property '{name}' or '{alt}'");
 35        }
 36
 70337        var sourceElement = Get("source");
 70338        var targetElement = Get("target");
 39
 40        // now inside sourceElement and targetElement, their children
 41        // are again PascalCased (“Activity”, “Port”), so do the same thing:
 42
 43        string GetId(JsonElement container, string propName)
 44        {
 140645            if (container.TryGetProperty(propName, out var p))
 140646                return p.GetString()!;
 047            var alt = char.ToUpperInvariant(propName[0]) + propName.Substring(1);
 048            return container.GetProperty(alt).GetString()!;
 49        }
 50
 51        string? GetPort(JsonElement container, string propName)
 52        {
 140653            if (container.TryGetProperty(propName, out var p))
 140654                return p.GetString();
 055            var alt = char.ToUpperInvariant(propName[0]) + propName.Substring(1);
 056            return container.TryGetProperty(alt, out p) ? p.GetString() : null;
 57        }
 58
 70359        var sourceId = GetId(sourceElement, "activity");
 70360        var targetId = GetId(targetElement, "activity"); // Note: this could be null
 70361        var sourcePort = GetPort(sourceElement, "port");
 70362        var targetPort = GetPort(targetElement, "port");
 63
 70364        var sourceAct = sourceId != null! && activities.TryGetValue(sourceId, out var s) ? s : null;
 70365        var targetAct = targetId != null! && activities.TryGetValue(targetId, out var t) ? t : null;
 66
 70367        if (sourceAct == null || targetAct == null)
 68        {
 069            _logger.LogWarning("Could not find source or target activity for connection. SourceId: {SourceId}, TargetId:
 070            return null;
 71        }
 72
 70373        var source = new Endpoint(sourceAct, sourcePort);
 70374        var target = new Endpoint(targetAct, targetPort);
 75
 76        // vertices is already correct:
 70377        var vertices = Array.Empty<Position>();
 70378        if (doc.RootElement.TryGetProperty("vertices", out var vertsEl) && vertsEl.ValueKind == JsonValueKind.Array)
 079            vertices = vertsEl.Deserialize<Position[]>(options)!;
 80
 70381        return new(source, target)
 70382        {
 70383            Vertices = vertices
 70384        };
 85    }
 86
 87    /// <inheritdoc />
 88    public override void Write(Utf8JsonWriter writer, Connection? value, JsonSerializerOptions options)
 89    {
 37990        if (value == null || value.Source.Activity == null! || value.Target.Activity == null!)
 091            return;
 92
 37993        var model = new
 37994        {
 37995            Source = new
 37996            {
 37997                Activity = value.Source.Activity.Id,
 37998                Port = value.Source.Port
 37999            },
 379100            Target = new
 379101            {
 379102                Activity = value.Target.Activity.Id,
 379103                Port = value.Target.Port
 379104            },
 379105            Vertices = value.Vertices,
 379106        };
 107
 379108        JsonSerializer.Serialize(writer, model, options);
 379109    }
 110}