< 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    {
 32519        yield return CreateLiteralDescriptor();
 32520        yield return CreateObjectDescriptor();
 32521        yield return CreateJsonDescriptor();
 32522        yield return CreateDelegateDescriptor();
 32523        yield return CreateVariableDescriptor();
 32524        yield return CreateInputDescriptor();
 32525    }
 26
 27    private ExpressionDescriptor CreateLiteralDescriptor()
 28    {
 32529        return CreateDescriptor<LiteralExpressionHandler>(
 32530            "Literal",
 32531            "Literal",
 32532            isBrowsable: false,
 312133            memoryBlockReferenceFactory: () => new Literal(),
 32534            deserialize: context =>
 32535            {
 312136                var elementValue = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 312137                var value = elementValue.GetValue();
 312138                return new Expression("Literal", value);
 32539            });
 40    }
 41
 32542    private ExpressionDescriptor CreateObjectDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Object", "Object
 43
 44    [Obsolete("Use Object instead.")]
 32545    private ExpressionDescriptor CreateJsonDescriptor() => CreateDescriptor<ObjectExpressionHandler>("Json", "Json", mon
 46
 32547    private ExpressionDescriptor CreateDelegateDescriptor() => CreateDescriptor<DelegateExpressionHandler>("Delegate", "
 48
 49    private ExpressionDescriptor CreateVariableDescriptor()
 50    {
 32551        return CreateDescriptor<VariableExpressionHandler>(
 32552            "Variable",
 32553            "Variable",
 32554            isBrowsable: true,
 055            memoryBlockReferenceFactory: () => new Variable(),
 32556            deserialize: context =>
 32557            {
 058                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 059                var valueString = valueElement.GetValue()?.ToString();
 32560
 061                if (string.IsNullOrWhiteSpace(valueString))
 062                    return new Expression("Variable", null);
 32563
 32564                try
 32565                {
 066                    var value = JsonSerializer.Deserialize(valueString, context.MemoryBlockType, context.Options);
 067                    return new Expression("Variable", value);
 32568                }
 069                catch (Exception)
 32570                {
 071                    return new Expression("Variable", null);
 32572                }
 073            }
 32574        );
 75    }
 76
 77    private ExpressionDescriptor CreateInputDescriptor()
 78    {
 32579        return CreateDescriptor<InputExpressionHandler>(
 32580            "Input",
 32581            "Input", // Displayed text in UI (input selection dropdown)
 32582            isBrowsable: true,
 32583            deserialize: context =>
 32584            {
 085                var valueElement = context.JsonElement.TryGetProperty("value", out var v) ? v : default;
 086                var valueString = valueElement.GetValue()?.ToString();
 32587
 088                if (string.IsNullOrWhiteSpace(valueString)) return new Expression("Input", null);
 32589
 32590                try
 32591                {
 092                    var value = JsonSerializer.Deserialize(valueString, typeof(InputDefinition), context.Options);
 32593
 094                    return new Expression("Input", value);
 32595                }
 096                catch (Exception)
 32597                {
 098                    return new Expression("Input", null);
 32599                }
 0100            }
 325101        );
 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    {
 1950114        var descriptor = new ExpressionDescriptor
 1950115        {
 1950116            Type = expressionType,
 1950117            DisplayName = displayName,
 1950118            IsSerializable = isSerializable,
 1950119            IsBrowsable = isBrowsable,
 3606120            HandlerFactory = sp => ActivatorUtilities.GetServiceOrCreateInstance<THandler>(sp),
 341121            MemoryBlockReferenceFactory = memoryBlockReferenceFactory ?? (() => new MemoryBlockReference())
 1950122        };
 123
 1950124        if (deserialize != null)
 975125            descriptor.Deserialize = deserialize;
 126
 1950127        if (monacoLanguage != null)
 650128            descriptor.Properties = new
 650129            {
 650130                MonacoLanguage = monacoLanguage
 650131            }.ToDictionary();
 132
 1950133        return descriptor;
 134    }
 135}