elsa-core/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs

104 lines
4.1 KiB
C#
Raw Normal View History

2022-01-04 08:42:12 +00:00
using Elsa.Expressions;
using Elsa.Expressions.Contracts;
using Elsa.Expressions.Models;
using Elsa.Workflows.Core.Contracts;
using Elsa.Workflows.Core.Expressions;
2023-05-28 18:32:51 +00:00
using Elsa.Workflows.Core.Models;
2022-01-04 08:42:12 +00:00
namespace Elsa.Workflows.Management.Providers;
2022-01-04 08:42:12 +00:00
/// <inheritdoc />
2022-01-04 08:42:12 +00:00
public class DefaultExpressionSyntaxProvider : IExpressionSyntaxProvider
{
private readonly IIdentityGenerator _identityGenerator;
/// <summary>
/// Initializes a new instance of the <see cref="DefaultExpressionSyntaxProvider"/> class.
/// </summary>
2022-01-04 08:42:12 +00:00
public DefaultExpressionSyntaxProvider(IIdentityGenerator identityGenerator)
{
_identityGenerator = identityGenerator;
}
/// <inheritdoc />
2022-01-04 08:42:12 +00:00
public ValueTask<IEnumerable<ExpressionSyntaxDescriptor>> GetDescriptorsAsync(CancellationToken cancellationToken = default)
{
var literal = CreateLiteralDescriptor();
var @object = CreateObjectDescriptor();
2022-01-04 08:42:12 +00:00
var json = CreateJsonDescriptor();
var @delegate = CreateDelegateDescriptor();
2023-05-28 18:32:51 +00:00
var variable = CreateVariableDescriptor();
2022-01-04 08:42:12 +00:00
2023-05-28 18:32:51 +00:00
return ValueTask.FromResult<IEnumerable<ExpressionSyntaxDescriptor>>(new[] { literal, @object, json, @delegate, variable });
2022-01-04 08:42:12 +00:00
}
2023-05-28 18:32:51 +00:00
private ExpressionSyntaxDescriptor CreateLiteralDescriptor() => CreateDescriptor<LiteralExpression>(
2022-01-04 08:42:12 +00:00
"Literal",
CreateLiteralExpression,
context => new Literal(context.GetExpression<LiteralExpression>().Value),
expression => expression.Value);
2023-05-28 18:32:51 +00:00
private ExpressionSyntaxDescriptor CreateObjectDescriptor() => CreateDescriptor<ObjectExpression>(
"Object",
CreateObjectExpression,
context => new ObjectLiteral(context.GetExpression<ObjectExpression>().Value),
expression => expression.Value);
// TODO: this is replaced by the above and exists only for existing workflow definitions. To be removed in a future version.
[Obsolete]
2023-05-28 18:32:51 +00:00
private ExpressionSyntaxDescriptor CreateJsonDescriptor() => CreateDescriptor<ObjectExpression>(
2022-01-04 08:42:12 +00:00
"Json",
CreateObjectExpression,
context => new ObjectLiteral(context.GetExpression<ObjectExpression>().Value),
2022-01-04 08:42:12 +00:00
expression => expression.Value);
2023-05-28 18:32:51 +00:00
private ExpressionSyntaxDescriptor CreateDelegateDescriptor() => CreateDescriptor<DelegateExpression>(
"Delegate",
CreateObjectExpression,
2022-06-14 13:56:41 +00:00
context => new DelegateBlockReference(),
expression => expression.DelegateBlockReference.Delegate?.ToString());
2023-05-28 18:32:51 +00:00
private ExpressionSyntaxDescriptor CreateVariableDescriptor() => CreateDescriptor<VariableExpression>(
"Variable",
CreateVariableExpression,
context => new Variable(),
expression => expression.Variable);
private static ExpressionSyntaxDescriptor CreateDescriptor<TExpression>(
2022-01-04 08:42:12 +00:00
string syntax,
Func<ExpressionConstructorContext, IExpression> constructor,
Func<BlockReferenceConstructorContext, MemoryBlockReference> createBlockReference,
2022-01-04 08:42:12 +00:00
Func<TExpression, object?> expressionValue) =>
new()
{
Syntax = syntax,
Type = typeof(TExpression),
CreateExpression = constructor,
CreateBlockReference = createBlockReference,
2022-01-04 08:42:12 +00:00
CreateSerializableObject = context => new
{
Type = syntax,
Value = expressionValue(context.GetExpression<TExpression>())
}
};
private static IExpression CreateLiteralExpression(ExpressionConstructorContext context)
2022-01-04 08:42:12 +00:00
{
return !context.Element.TryGetProperty("value", out var expressionValue)
? new LiteralExpression()
: new LiteralExpression(expressionValue.ToString());
2022-01-04 08:42:12 +00:00
}
private IExpression CreateObjectExpression(ExpressionConstructorContext context)
2022-01-04 08:42:12 +00:00
{
var expressionValue = context.Element.GetProperty("value").ToString();
return new ObjectExpression(expressionValue);
2022-01-04 08:42:12 +00:00
}
2023-05-28 18:32:51 +00:00
private IExpression CreateVariableExpression(ExpressionConstructorContext context)
{
return new VariableExpression();
}
2022-01-04 08:42:12 +00:00
private string GenerateId() => _identityGenerator.GenerateId();
}