diff --git a/src/core/Elsa.Core/Activities/ControlFlow/For.cs b/src/core/Elsa.Core/Activities/ControlFlow/For.cs index dc6f29b3e..1480740c6 100644 --- a/src/core/Elsa.Core/Activities/ControlFlow/For.cs +++ b/src/core/Elsa.Core/Activities/ControlFlow/For.cs @@ -14,6 +14,17 @@ public enum ForOperator public class For : Activity { + public For() + { + } + + public For(int start, int end, ForOperator forOperator = ForOperator.LessThanOrEqual) + { + Start = new Input(start); + End = new Input(end); + Operator = new Input(forOperator); + } + public Input Start { get; set; } = new(0); public Input End { get; set; } = new(0); public Input Step { get; set; } = new(1); diff --git a/src/core/Elsa.Core/Expressions/OutputExpression.cs b/src/core/Elsa.Core/Expressions/OutputExpression.cs new file mode 100644 index 000000000..8f0803385 --- /dev/null +++ b/src/core/Elsa.Core/Expressions/OutputExpression.cs @@ -0,0 +1,36 @@ +using Elsa.Contracts; +using Elsa.Models; + +namespace Elsa.Expressions; + +public class OutputExpression : IExpression +{ + public OutputExpression(Output? output) + { + Output = output; + } + + public OutputExpression() + { + } + + public Output? Output { get; set; } +} + +public class OutputExpression : OutputExpression +{ + public OutputExpression(Output? output) : base(output) + { + } +} + +public class OutputExpressionHandler : IExpressionHandler +{ + public ValueTask EvaluateAsync(IExpression expression, Type returnType, ExpressionExecutionContext context) + { + var outputExpression = (OutputExpression)expression; + var output = outputExpression.Output; + var value = context.Get(output); + return ValueTask.FromResult(value); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Extensions/ActivityExtensions.cs b/src/core/Elsa.Core/Extensions/ActivityExtensions.cs index 3b8ab7fb0..4374b80be 100644 --- a/src/core/Elsa.Core/Extensions/ActivityExtensions.cs +++ b/src/core/Elsa.Core/Extensions/ActivityExtensions.cs @@ -33,9 +33,12 @@ public static class ActivityExtensions return query.Select(x => x!).ToList(); } - - - + + /// + /// Creates an input from the activity's result. + /// + public static Input CreateInput(this Activity activity) => activity.Result.CreateInput(); + public static IEnumerable GetVariables(this IActivity activity) { var properties = activity.GetType().GetProperties(); diff --git a/src/core/Elsa.Core/Extensions/OutputExtensions.cs b/src/core/Elsa.Core/Extensions/OutputExtensions.cs new file mode 100644 index 000000000..39eb4bec2 --- /dev/null +++ b/src/core/Elsa.Core/Extensions/OutputExtensions.cs @@ -0,0 +1,11 @@ +using Elsa.Models; + +namespace Elsa.Extensions; + +public static class OutputExtensions +{ + /// + /// Creates an input that references the specified output's value. + /// + public static Input CreateInput(this Output? output) => new(output); +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Models/Activity.cs b/src/core/Elsa.Core/Models/Activity.cs index 729f2ca3f..3428866d5 100644 --- a/src/core/Elsa.Core/Models/Activity.cs +++ b/src/core/Elsa.Core/Models/Activity.cs @@ -38,4 +38,5 @@ public abstract class ActivityWithResult : Activity public abstract class Activity : ActivityWithResult { + public new Output? Result { get; set; } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Models/ExpressionExecutionContext.cs b/src/core/Elsa.Core/Models/ExpressionExecutionContext.cs index 404427f36..91a566414 100644 --- a/src/core/Elsa.Core/Models/ExpressionExecutionContext.cs +++ b/src/core/Elsa.Core/Models/ExpressionExecutionContext.cs @@ -26,6 +26,8 @@ public class ExpressionExecutionContext public object Get(RegisterLocationReference locationReference) => GetLocation(locationReference).Value!; public T Get(RegisterLocationReference locationReference) => (T)Get(locationReference); public T? Get(Input? input) => input != null ? (T?)GetLocation(input.LocationReference).Value : default; + public T? Get(Output? output) => output != null ? (T?)GetLocation(output.LocationReference).Value : default; + public object? Get(Output? output) => output != null ? GetLocation(output.LocationReference).Value : default; public T? GetVariable(string name) => (T?)GetVariable(name); public T? GetVariable() => (T?)GetVariable(typeof(T).Name); diff --git a/src/core/Elsa.Core/Models/Input.cs b/src/core/Elsa.Core/Models/Input.cs index eae3aa53e..da27f5b35 100644 --- a/src/core/Elsa.Core/Models/Input.cs +++ b/src/core/Elsa.Core/Models/Input.cs @@ -40,6 +40,14 @@ public class Input : Input public Input(Variable variable) : base(new VariableExpression(variable), variable, typeof(T)) { } + + public Input(Output? output) : base(new OutputExpression(output), output?.LocationReference ?? new Literal(), typeof(T)) + { + } + + public Input(Output? output) : base(new OutputExpression(output), output?.LocationReference ?? new Literal(), typeof(T)) + { + } public Input(Literal literal) : base(new LiteralExpression(literal.Value), literal, typeof(T)) { diff --git a/src/core/Elsa.Core/Models/NodeIdentity.cs b/src/core/Elsa.Core/Models/NodeIdentity.cs deleted file mode 100644 index cce4c2ac7..000000000 --- a/src/core/Elsa.Core/Models/NodeIdentity.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace Elsa.Models; - -//public record NodeIdentity(ActivityNode ActivityNode, string NodeName); \ No newline at end of file