< 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    {
 32319        yield return CreateLiteralDescriptor();
 32320        yield return CreateObjectDescriptor();
 32321        yield return CreateJsonDescriptor();
 32322        yield return CreateDelegateDescriptor();
 32323        yield return CreateVariableDescriptor();
 32324        yield return CreateInputDescriptor();
 32325    }
 26
 27    private ExpressionDescriptor CreateLiteralDescriptor()
 28    {
 32329        return CreateDescriptor<LiteralExpressionHandler>(
 32330            "Literal",
 32331            "Literal",
 32332            isBrowsable: false,
 257033            memoryBlockReferenceFactory: () => new Literal(),
 32334            deserialize: context =>
 32335            {
 257036                var elementValue = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 257037                var value = elementValue.GetValue();
 257038                return new Expression("Literal", value);
 32339            });
 40    }
 41
 32342    private ExpressionDescriptor CreateObjectDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Object", "Object
 43
 44    [Obsolete("Use Object instead.")]
 32345    private ExpressionDescriptor CreateJsonDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Json", "Json", mon
 46
 32347    private ExpressionDescriptor CreateDelegateDescriptor() => CreateDescriptor<DelegateExpressionHandler>("Delegate", "
 48
 49    private ExpressionDescriptor CreateVariableDescriptor()
 50    {
 32351        return CreateDescriptor<VariableExpressionHandler>(
 32352            "Variable",
 32353            "Variable",
 32354            isBrowsable: true,
 055            memoryBlockReferenceFactory: () => new Variable(),
 32356            deserialize: context =>
 32357            {
 058                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 059                var valueString = valueElement.GetValue()?.ToString();
 32360
 061                if (string.IsNullOrWhiteSpace(valueString))
 062                    return new Expression("Variable", null);
 32363
 32364                try
 32365                {
 066                    var value = JsonSerializer.Deserialize(valueString, context.MemoryBlockType, context.Options);
 067                    return new Expression("Variable", value);
 32368                }
 069                catch (Exception)
 32370                {
 071                    return new Expression("Variable", null);
 32372                }
 073            }
 32374        );
 75    }
 76
 77    private ExpressionDescriptor CreateInputDescriptor()
 78    {
 32379        return CreateDescriptor<InputExpressionHandler>(
 32380            "Input",
 32381            "Input", // Displayed text in UI (input selection dropdown)
 32382            isBrowsable: true,
 32383            deserialize: context =>
 32384            {
 085                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 086                var valueString = valueElement.GetValue()?.ToString();
 32387
 088                if (string.IsNullOrWhiteSpace(valueString)) return new Expression("Input", null);
 32389
 32390                try
 32391                {
 092                    var value = JsonSerializer.Deserialize(valueString, typeof(InputDefinition), context.Options);
 32393
 094                    return new Expression("Input", value);
 32395                }
 096                catch (Exception)
 32397                {
 098                    return new Expression("Input", null);
 32399                }
 0100            }
 323101        );
 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    {
 1938114        var descriptor = new ExpressionDescriptor
 1938115        {
 1938116            Type = expressionType,
 1938117            DisplayName = displayName,
 1938118            IsSerializable = isSerializable,
 1938119            IsBrowsable = isBrowsable,
 3492120            HandlerFactory = sp => ActivatorUtilities.GetServiceOrCreateInstance<THandler>(sp),
 278121            MemoryBlockReferenceFactory = memoryBlockReferenceFactory ?? (() => new MemoryBlockReference())
 1938122        };
 123
 1938124        if (deserialize != null)
 969125            descriptor.Deserialize = deserialize;
 126
 1938127        if (monacoLanguage != null)
 646128            descriptor.Properties = new
 646129            {
 646130                MonacoLanguage = monacoLanguage
 646131            }.ToDictionary();
 132
 1938133        return descriptor;
 134    }
 135}