< Summary

Information
Class: Elsa.Workflows.VariableMapper
Assembly: Elsa.Workflows.Core
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/VariableMapper.cs
Line coverage
87%
Covered lines: 34
Uncovered lines: 5
Coverable lines: 39
Total lines: 111
Line coverage: 87.1%
Branch coverage
70%
Covered branches: 21
Total branches: 30
Branch coverage: 70%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.ctor()100%210%
Map(...)50%22100%
Map(...)66.66%66100%
GetTypeName(...)75%44100%
ResolveVariableType(...)50%6450%
ResolveStorageDriverType(...)100%66100%
IsStorageDriverType(...)62.5%88100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Core/Services/VariableMapper.cs

#LineLine coverage
 1using Elsa.Expressions.Helpers;
 2using Elsa.Extensions;
 3using Elsa.Workflows.Memory;
 4using Elsa.Workflows.Models;
 5using Elsa.Workflows.Services;
 6using Microsoft.Extensions.Logging;
 7using Microsoft.Extensions.Logging.Abstractions;
 8using Elsa.Common.Serialization;
 9
 10namespace Elsa.Workflows;
 11
 12/// <summary>
 13/// Maps variables to and from <see cref="VariableModel"/> instances.
 14/// </summary>
 15public class VariableMapper
 16{
 17    private readonly ILogger<VariableMapper> _logger;
 18    private readonly ISerializationTypeRegistry _workflowJsonTypeRegistry;
 19
 20    /// <summary>
 21    /// Initializes a new instance of the <see cref="VariableMapper"/> class.
 22    /// </summary>
 23    /// <param name="workflowJsonTypeRegistry">The serialization type registry.</param>
 24    /// <param name="logger">The logger.</param>
 1540425    public VariableMapper(ISerializationTypeRegistry workflowJsonTypeRegistry, ILogger<VariableMapper> logger)
 26    {
 1540427        _workflowJsonTypeRegistry = workflowJsonTypeRegistry;
 1540428        _logger = logger;
 1540429    }
 30
 31    /// <inheritdoc />
 032    public VariableMapper() : this(SerializationTypeRegistry.CreateDefault(), NullLogger<VariableMapper>.Instance)
 33    {
 34
 035    }
 36
 37    /// <summary>
 38    /// Maps a <see cref="Variable"/> to a <see cref="VariableModel"/>.
 39    /// </summary>
 40    public Variable Map(VariableModel source)
 41    {
 250942        var type = ResolveVariableType(source.TypeName);
 43
 250944        var variableGenericType = typeof(Variable<>).MakeGenericType(type);
 250945        var variable = (Variable)Activator.CreateInstance(variableGenericType)!;
 46
 47        // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract
 250948        variable.Id = source.Id ?? Guid.NewGuid().ToString("N"); // Temporarily assign a new ID if the source doesn't ha
 250949        variable.Name = source.Name;
 50
 250951        source.Value.TryConvertTo(type)
 250952            .OnSuccess(value => variable.Value = value)
 250953            .OnFailure(e => _logger.LogWarning("Failed to convert {SourceValue} to {TargetType}", source.Value, type.Nam
 54
 250955        variable.StorageDriverType = ResolveStorageDriverType(source.StorageDriverTypeName);
 56
 250957        return variable;
 58    }
 59
 60    /// <summary>
 61    /// Maps a <see cref="VariableModel"/> to a <see cref="Variable"/>.
 62    /// </summary>
 63    public VariableModel Map(Variable source)
 64    {
 116965        var variableType = source.GetType();
 116966        var value = source.Value;
 116967        var valueType = variableType.IsConstructedGenericType ? variableType.GetGenericArguments().FirstOrDefault() ?? t
 116968        var valueTypeAlias = SerializationTypeResolver.TryGetAlias(_workflowJsonTypeRegistry, valueType, out var alias) 
 116969        var storageDriverTypeName = GetTypeName(source.StorageDriverType);
 116970        var serializedValue = value.Format();
 71
 116972        return new(source.Id, source.Name, valueTypeAlias, serializedValue, storageDriverTypeName);
 73    }
 74
 75    private string? GetTypeName(Type? type)
 76    {
 116977        if (type == null)
 7978            return null;
 79
 109080        return SerializationTypeResolver.TryGetAlias(_workflowJsonTypeRegistry, type, out var alias) ? alias : type.GetS
 81    }
 82
 83    private Type ResolveVariableType(string? typeAlias)
 84    {
 250985        if (string.IsNullOrWhiteSpace(typeAlias))
 086            return typeof(object);
 87
 250988        if (SerializationTypeResolver.TryResolveType(_workflowJsonTypeRegistry, typeAlias, out var type))
 250989            return type;
 90
 091        _logger.LogWarning("Failed to resolve variable type alias {VariableTypeName}", typeAlias);
 092        return typeof(object);
 93    }
 94
 95    private Type? ResolveStorageDriverType(string? typeAlias)
 96    {
 250997        if (string.IsNullOrWhiteSpace(typeAlias))
 11598            return null;
 99
 2394100        if (SerializationTypeResolver.TryResolveType(_workflowJsonTypeRegistry, typeAlias, out var type) && IsStorageDri
 2392101            return type;
 102
 2103        _logger.LogWarning("Failed to resolve storage driver type alias {StorageDriverTypeName}", typeAlias);
 2104        return null;
 105    }
 106
 107    private static bool IsStorageDriverType(Type type)
 108    {
 2393109        return typeof(IStorageDriver).IsAssignableFrom(type) && type is { IsAbstract: false, IsInterface: false, Contain
 110    }
 111}