using Elsa.Expressions; using Elsa.Expressions.Contracts; using Elsa.Expressions.Models; using Elsa.Workflows.Core.Contracts; using Elsa.Workflows.Core.Expressions; using Elsa.Workflows.Core.Services; namespace Elsa.Workflows.Management.Providers; public class DefaultExpressionSyntaxProvider : IExpressionSyntaxProvider { private readonly IIdentityGenerator _identityGenerator; public DefaultExpressionSyntaxProvider(IIdentityGenerator identityGenerator) { _identityGenerator = identityGenerator; } public ValueTask> GetDescriptorsAsync(CancellationToken cancellationToken = default) { var literal = CreateLiteralDescriptor(); var json = CreateJsonDescriptor(); var @delegate = CreateDelegateDescriptor(); return ValueTask.FromResult>(new[] { literal, json, @delegate }); } private ExpressionSyntaxDescriptor CreateLiteralDescriptor() => CreateDescriptor( "Literal", CreateLiteralExpression, context => new Literal(context.GetExpression().Value), expression => expression.Value); private ExpressionSyntaxDescriptor CreateJsonDescriptor() => CreateDescriptor( "Json", CreateJsonExpression, context => new JsonLiteral(context.GetExpression().Value), expression => expression.Value); private ExpressionSyntaxDescriptor CreateDelegateDescriptor() => CreateDescriptor( "Delegate", CreateJsonExpression, context => new DelegateBlockReference(), expression => expression.DelegateBlockReference.Delegate?.ToString()); private ExpressionSyntaxDescriptor CreateDescriptor( string syntax, Func constructor, Func createBlockReference, Func expressionValue) => new() { Syntax = syntax, Type = typeof(TExpression), CreateExpression = constructor, CreateBlockReference = createBlockReference, CreateSerializableObject = context => new { Type = syntax, Value = expressionValue(context.GetExpression()) } }; private IExpression CreateLiteralExpression(ExpressionConstructorContext context) { return !context.Element.TryGetProperty("value", out var expressionValue) ? new LiteralExpression() : new LiteralExpression(expressionValue.ToString()); } private IExpression CreateJsonExpression(ExpressionConstructorContext context) { var expressionValue = context.Element.GetProperty("value").ToString(); return new JsonExpression(expressionValue); } private string GenerateId() => _identityGenerator.GenerateId(); }