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

91 lines
3.7 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;
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();
2022-01-04 08:42:12 +00:00
return ValueTask.FromResult<IEnumerable<ExpressionSyntaxDescriptor>>(new[] { literal, @object, json, @delegate });
2022-01-04 08:42:12 +00:00
}
private ExpressionSyntaxDescriptor CreateLiteralDescriptor() => DefaultExpressionSyntaxProvider.CreateDescriptor<LiteralExpression>(
2022-01-04 08:42:12 +00:00
"Literal",
CreateLiteralExpression,
context => new Literal(context.GetExpression<LiteralExpression>().Value),
expression => expression.Value);
private ExpressionSyntaxDescriptor CreateObjectDescriptor() => DefaultExpressionSyntaxProvider.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]
private ExpressionSyntaxDescriptor CreateJsonDescriptor() => DefaultExpressionSyntaxProvider.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);
private ExpressionSyntaxDescriptor CreateDelegateDescriptor() => DefaultExpressionSyntaxProvider.CreateDescriptor<DelegateExpression>(
"Delegate",
CreateObjectExpression,
2022-06-14 13:56:41 +00:00
context => new DelegateBlockReference(),
expression => expression.DelegateBlockReference.Delegate?.ToString());
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
}
private string GenerateId() => _identityGenerator.GenerateId();
}