< Summary

Information
Class: Elsa.Workflows.Management.Providers.DefaultExpressionDescriptorProvider
Assembly: Elsa.Workflows.Management
File(s): /home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs
Line coverage
78%
Covered lines: 67
Uncovered lines: 18
Coverable lines: 85
Total lines: 135
Line coverage: 78.8%
Branch coverage
50%
Covered branches: 12
Total branches: 24
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
GetDescriptors()100%11100%
CreateLiteralDescriptor()100%22100%
CreateObjectDescriptor()100%11100%
CreateJsonDescriptor()100%11100%
CreateDelegateDescriptor()100%11100%
CreateVariableDescriptor()0%9658.33%
CreateInputDescriptor()0%8665.21%
CreateDescriptor(...)100%1010100%

File(s)

/home/runner/work/elsa-core/elsa-core/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionDescriptorProvider.cs

#LineLine coverage
 1using System.Text.Json;
 2using Elsa.Expressions;
 3using Elsa.Expressions.Contracts;
 4using Elsa.Expressions.Models;
 5using Elsa.Extensions;
 6using Elsa.Workflows.Expressions;
 7using Elsa.Workflows.Memory;
 8using Elsa.Workflows.Models;
 9using Microsoft.Extensions.DependencyInjection;
 10
 11namespace Elsa.Workflows.Management.Providers;
 12
 13/// <inheritdoc />
 14public class DefaultExpressionDescriptorProvider : IExpressionDescriptorProvider
 15{
 16    /// <inheritdoc />
 17    public IEnumerable<ExpressionDescriptor> GetDescriptors()
 18    {
 32119        yield return CreateLiteralDescriptor();
 32120        yield return CreateObjectDescriptor();
 32121        yield return CreateJsonDescriptor();
 32122        yield return CreateDelegateDescriptor();
 32123        yield return CreateVariableDescriptor();
 32124        yield return CreateInputDescriptor();
 32125    }
 26
 27    private ExpressionDescriptor CreateLiteralDescriptor()
 28    {
 32129        return CreateDescriptor<LiteralExpressionHandler>(
 32130            "Literal",
 32131            "Literal",
 32132            isBrowsable: false,
 414033            memoryBlockReferenceFactory: () => new Literal(),
 32134            deserialize: context =>
 32135            {
 414036                var elementValue = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 414037                var value = elementValue.GetValue();
 414038                return new Expression("Literal", value);
 32139            });
 40    }
 41
 32142    private ExpressionDescriptor CreateObjectDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Object", "Object
 43
 44    [Obsolete("Use Object instead.")]
 32145    private ExpressionDescriptor CreateJsonDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Json", "Json", mon
 46
 32147    private ExpressionDescriptor CreateDelegateDescriptor() => CreateDescriptor<DelegateExpressionHandler>("Delegate", "
 48
 49    private ExpressionDescriptor CreateVariableDescriptor()
 50    {
 32151        return CreateDescriptor<VariableExpressionHandler>(
 32152            "Variable",
 32153            "Variable",
 32154            isBrowsable: true,
 055            memoryBlockReferenceFactory: () => new Variable(),
 32156            deserialize: context =>
 32157            {
 058                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 059                var valueString = valueElement.GetValue()?.ToString();
 32160
 061                if (string.IsNullOrWhiteSpace(valueString))
 062                    return new Expression("Variable", null);
 32163
 32164                try
 32165                {
 066                    var value = JsonSerializer.Deserialize(valueString, context.MemoryBlockType, context.Options);
 067                    return new Expression("Variable", value);
 32168                }
 069                catch (Exception)
 32170                {
 071                    return new Expression("Variable", null);
 32172                }
 073            }
 32174        );
 75    }
 76
 77    private ExpressionDescriptor CreateInputDescriptor()
 78    {
 32179        return CreateDescriptor<InputExpressionHandler>(
 32180            "Input",
 32181            "Input", // Displayed text in UI (input selection dropdown)
 32182            isBrowsable: true,
 32183            deserialize: context =>
 32184            {
 085                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 086                var valueString = valueElement.GetValue()?.ToString();
 32187
 088                if (string.IsNullOrWhiteSpace(valueString)) return new Expression("Input", null);
 32189
 32190                try
 32191                {
 092                    var value = JsonSerializer.Deserialize(valueString, typeof(InputDefinition), context.Options);
 32193
 094                    return new Expression("Input", value);
 32195                }
 096                catch (Exception)
 32197                {
 098                    return new Expression("Input", null);
 32199                }
 0100            }
 321101        );
 102    }
 103
 104    private static ExpressionDescriptor CreateDescriptor<THandler>(
 105        string expressionType,
 106        string displayName,
 107        bool isSerializable = true,
 108        bool isBrowsable = true,
 109        string? monacoLanguage = null,
 110        Func<MemoryBlockReference>? memoryBlockReferenceFactory = default,
 111        Func<ExpressionSerializationContext, Expression>? deserialize = default)
 112        where THandler : IExpressionHandler
 113    {
 1926114        var descriptor = new ExpressionDescriptor
 1926115        {
 1926116            Type = expressionType,
 1926117            DisplayName = displayName,
 1926118            IsSerializable = isSerializable,
 1926119            IsBrowsable = isBrowsable,
 3490120            HandlerFactory = sp => ActivatorUtilities.GetServiceOrCreateInstance<THandler>(sp),
 387121            MemoryBlockReferenceFactory = memoryBlockReferenceFactory ?? (() => new MemoryBlockReference())
 1926122        };
 123
 1926124        if (deserialize != null)
 963125            descriptor.Deserialize = deserialize;
 126
 1926127        if (monacoLanguage != null)
 642128            descriptor.Properties = new
 642129            {
 642130                MonacoLanguage = monacoLanguage
 642131            }.ToDictionary();
 132
 1926133        return descriptor;
 134    }
 135}