< 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>
 423611public class ConnectionJsonConverter(IDictionary<string, IActivity> activities, ILoggerFactory loggerFactory) : JsonConv
 12{
 423613    private readonly ILogger _logger = loggerFactory.CreateLogger<ConnectionJsonConverter>();
 14
 15    /// <inheritdoc />
 12700216    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    {
 94921        if (!JsonDocument.TryParseValue(ref reader, out var doc))
 022            throw new JsonException("Failed to parse JsonDocument");
 23
 94924        var root = doc.RootElement;
 25
 26        // case‐insensitive get
 27        JsonElement Get(string name)
 28        {
 189829            if (root.TryGetProperty(name, out var e))
 189830                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
 94937        var sourceElement = Get("source");
 94938        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        {
 189845            if (container.TryGetProperty(propName, out var p))
 189846                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        {
 189853            if (container.TryGetProperty(propName, out var p))
 189854                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
 94959        var sourceId = GetId(sourceElement, "activity");
 94960        var targetId = GetId(targetElement, "activity"); // Note: this could be null
 94961        var sourcePort = GetPort(sourceElement, "port");
 94962        var targetPort = GetPort(targetElement, "port");
 63
 94964        var sourceAct = sourceId != null! && activities.TryGetValue(sourceId, out var s) ? s : null;
 94965        var targetAct = targetId != null! && activities.TryGetValue(targetId, out var t) ? t : null;
 66
 94967        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
 94973        var source = new Endpoint(sourceAct, sourcePort);
 94974        var target = new Endpoint(targetAct, targetPort);
 75
 76        // vertices is already correct:
 94977        var vertices = Array.Empty<Position>();
 94978        if (doc.RootElement.TryGetProperty("vertices", out var vertsEl) && vertsEl.ValueKind == JsonValueKind.Array)
 079            vertices = vertsEl.Deserialize<Position[]>(options)!;
 80
 94981        return new(source, target)
 94982        {
 94983            Vertices = vertices
 94984        };
 85    }
 86
 87    /// <inheritdoc />
 88    public override void Write(Utf8JsonWriter writer, Connection? value, JsonSerializerOptions options)
 89    {
 38190        if (value == null || value.Source.Activity == null! || value.Target.Activity == null!)
 091            return;
 92
 38193        var model = new
 38194        {
 38195            Source = new
 38196            {
 38197                Activity = value.Source.Activity.Id,
 38198                Port = value.Source.Port
 38199            },
 381100            Target = new
 381101            {
 381102                Activity = value.Target.Activity.Id,
 381103                Port = value.Target.Port
 381104            },
 381105            Vertices = value.Vertices,
 381106        };
 107
 381108        JsonSerializer.Serialize(writer, model, options);
 381109    }
 110}