< 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    {
 31919        yield return CreateLiteralDescriptor();
 31920        yield return CreateObjectDescriptor();
 31921        yield return CreateJsonDescriptor();
 31922        yield return CreateDelegateDescriptor();
 31923        yield return CreateVariableDescriptor();
 31924        yield return CreateInputDescriptor();
 31925    }
 26
 27    private ExpressionDescriptor CreateLiteralDescriptor()
 28    {
 31929        return CreateDescriptor<LiteralExpressionHandler>(
 31930            "Literal",
 31931            "Literal",
 31932            isBrowsable: false,
 332133            memoryBlockReferenceFactory: () => new Literal(),
 31934            deserialize: context =>
 31935            {
 332136                var elementValue = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 332137                var value = elementValue.GetValue();
 332138                return new Expression("Literal", value);
 31939            });
 40    }
 41
 31942    private ExpressionDescriptor CreateObjectDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Object", "Object
 43
 44    [Obsolete("Use Object instead.")]
 31945    private ExpressionDescriptor CreateJsonDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Json", "Json", mon
 46
 31947    private ExpressionDescriptor CreateDelegateDescriptor() => CreateDescriptor<DelegateExpressionHandler>("Delegate", "
 48
 49    private ExpressionDescriptor CreateVariableDescriptor()
 50    {
 31951        return CreateDescriptor<VariableExpressionHandler>(
 31952            "Variable",
 31953            "Variable",
 31954            isBrowsable: true,
 055            memoryBlockReferenceFactory: () => new Variable(),
 31956            deserialize: context =>
 31957            {
 058                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 059                var valueString = valueElement.GetValue()?.ToString();
 31960
 061                if (string.IsNullOrWhiteSpace(valueString))
 062                    return new Expression("Variable", null);
 31963
 31964                try
 31965                {
 066                    var value = JsonSerializer.Deserialize(valueString, context.MemoryBlockType, context.Options);
 067                    return new Expression("Variable", value);
 31968                }
 069                catch (Exception)
 31970                {
 071                    return new Expression("Variable", null);
 31972                }
 073            }
 31974        );
 75    }
 76
 77    private ExpressionDescriptor CreateInputDescriptor()
 78    {
 31979        return CreateDescriptor<InputExpressionHandler>(
 31980            "Input",
 31981            "Input", // Displayed text in UI (input selection dropdown)
 31982            isBrowsable: true,
 31983            deserialize: context =>
 31984            {
 085                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 086                var valueString = valueElement.GetValue()?.ToString();
 31987
 088                if (string.IsNullOrWhiteSpace(valueString)) return new Expression("Input", null);
 31989
 31990                try
 31991                {
 092                    var value = JsonSerializer.Deserialize(valueString, typeof(InputDefinition), context.Options);
 31993
 094                    return new Expression("Input", value);
 31995                }
 096                catch (Exception)
 31997                {
 098                    return new Expression("Input", null);
 31999                }
 0100            }
 319101        );
 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    {
 1914114        var descriptor = new ExpressionDescriptor
 1914115        {
 1914116            Type = expressionType,
 1914117            DisplayName = displayName,
 1914118            IsSerializable = isSerializable,
 1914119            IsBrowsable = isBrowsable,
 3555120            HandlerFactory = sp => ActivatorUtilities.GetServiceOrCreateInstance<THandler>(sp),
 386121            MemoryBlockReferenceFactory = memoryBlockReferenceFactory ?? (() => new MemoryBlockReference())
 1914122        };
 123
 1914124        if (deserialize != null)
 957125            descriptor.Deserialize = deserialize;
 126
 1914127        if (monacoLanguage != null)
 638128            descriptor.Properties = new
 638129            {
 638130                MonacoLanguage = monacoLanguage
 638131            }.ToDictionary();
 132
 1914133        return descriptor;
 134    }
 135}