From 9981dc1f104c71f28dfccb5d903c07353e8a5101 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 22 Nov 2022 13:09:14 +0100 Subject: [PATCH] Add Complete activity for completing composite activities --- .../Activities/Complete.cs | 46 +++++++++++++++++++ .../Activities/Composite.cs | 4 +- .../Elsa.Samples.TelnyxIntegration/GetAge.cs | 22 ++++++--- 3 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 src/modules/Elsa.Workflows.Core/Activities/Complete.cs diff --git a/src/modules/Elsa.Workflows.Core/Activities/Complete.cs b/src/modules/Elsa.Workflows.Core/Activities/Complete.cs new file mode 100644 index 000000000..90ad5dd42 --- /dev/null +++ b/src/modules/Elsa.Workflows.Core/Activities/Complete.cs @@ -0,0 +1,46 @@ +using System.ComponentModel; +using Elsa.Expressions.Models; +using Elsa.Workflows.Core.Activities.Flowchart.Models; +using Elsa.Workflows.Core.Attributes; +using Elsa.Workflows.Core.Models; +using Elsa.Workflows.Core.Signals; + +namespace Elsa.Workflows.Core.Activities; + +/// +/// Signals the current composite activity to complete itself as a whole. +/// +[Activity("Elsa", "Primitives", "Signals the current composite activity to complete itself as a whole.")] +public class Complete : Activity +{ + /// + public Complete(params string[] outcomes) : this(new Input>(outcomes)) + { + } + + /// + public Complete(Func> outcomes) : this(new Input>(outcomes)) + { + } + + /// + public Complete(Func outcome) : this(context => new[] { outcome(context) }) + { + } + + /// + public Complete(Input> outcomes) => Outcomes = outcomes; + + /// + /// The outcome or set of outcomes to complete this activity with. + /// + [Description("The outcome or set of outcomes to complete this activity with.")] + public Input> Outcomes { get; set; } + + /// + protected override async ValueTask ExecuteAsync(ActivityExecutionContext context) + { + var outcomes = Outcomes.Get(context).ToArray(); + await context.SendSignalAsync(new CompleteCompositeSignal(new Outcomes(outcomes))); + } +} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Core/Activities/Composite.cs b/src/modules/Elsa.Workflows.Core/Activities/Composite.cs index ce42f19b1..9525c93d9 100644 --- a/src/modules/Elsa.Workflows.Core/Activities/Composite.cs +++ b/src/modules/Elsa.Workflows.Core/Activities/Composite.cs @@ -90,9 +90,9 @@ public abstract class Composite : ActivityBase /// /// Represents a composite activity that has a single activity and returns a result. /// -public class Composite : ActivityBase +public abstract class Composite : ActivityBase { - public Composite() + protected Composite() { OnSignalReceived(OnCompleteCompositeSignal); } diff --git a/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs b/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs index 708103123..a04405b87 100644 --- a/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs +++ b/src/samples/aspnet/Elsa.Samples.TelnyxIntegration/GetAge.cs @@ -1,5 +1,6 @@ using Elsa.Workflows.Core.Activities; using Elsa.Workflows.Core.Activities.Flowchart.Attributes; +using Elsa.Workflows.Core.Models; namespace Elsa.Samples.TelnyxIntegration; @@ -8,12 +9,21 @@ public class GetAge : Composite { public GetAge() { - Root = new Inline(async context => + var ageVariable = new Variable(); + + Root = new Sequence { - var random = new Random(); - var n = random.Next(2); - var outcome = n == 0 ? "Under 18" : "Over 18"; - await CompleteAsync(context, outcome); - }); + Variables = { ageVariable }, + Activities = + { + From(() => + { + var random = new Random(); + return random.Next(36); + }, ageVariable), + + new Complete(context => ageVariable.Get(context) < 18 ? "Under 18" : "Over 18") + } + }; } } \ No newline at end of file