Fix Finish + CompositeActivity

This commit is contained in:
Sipke Schoorstra 2021-02-13 11:16:20 +01:00
parent 2aed96616d
commit a02147d2ee
5 changed files with 31 additions and 26 deletions

View file

@ -40,9 +40,7 @@ namespace Elsa.Services
if (finishOutput != null)
{
if(!string.IsNullOrWhiteSpace(finishOutput.Outcome))
outcomes.Add(finishOutput.Outcome!);
outcomes.AddRange(finishOutput.Outcomes);
output = finishOutput.Output;
}

View file

@ -13,29 +13,29 @@ namespace Elsa.Activities.ControlFlow
{
public static IActivityBuilder Finish(this IBuilder builder, Action<ISetupActivity<Finish>>? setup = default, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Then(setup, null, lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<ActivityExecutionContext, ValueTask<object?>> output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<ActivityExecutionContext, object?> output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<object?> output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, object? output, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutput(output), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<ActivityExecutionContext, ValueTask<IEnumerable<string>?>> outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile);
builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<ActivityExecutionContext, IEnumerable<string>> outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile);
builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<IEnumerable<string>> outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile);
builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, IEnumerable<string> outcomes, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcomes), lineNumber, sourceFile);
builder.Finish(activity => activity.WithOutcomes(outcomes), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<ActivityExecutionContext, ValueTask<string>> outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<ActivityExecutionContext, string> outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, Func<string> outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile);
public static IActivityBuilder Finish(this IBuilder builder, string outcome, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.Finish(activity => activity.WithOutcome(outcome), lineNumber, sourceFile);
}
}

View file

@ -13,10 +13,15 @@ namespace Elsa.Activities.ControlFlow
public static ISetupActivity<Finish> WithOutput(this ISetupActivity<Finish> activity, Func<ActivityExecutionContext, object?> value) => activity.Set(x => x.OutputValue, value);
public static ISetupActivity<Finish> WithOutput(this ISetupActivity<Finish> activity, Func<object?> value) => activity.Set(x => x.OutputValue, value);
public static ISetupActivity<Finish> WithOutput(this ISetupActivity<Finish> activity, object? value) => activity.Set(x => x.OutputValue, value);
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, Func<ActivityExecutionContext, ValueTask<IEnumerable<string>?>> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, Func<ActivityExecutionContext, IEnumerable<string>> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, Func<IEnumerable<string>> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, IEnumerable<string> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcomes(this ISetupActivity<Finish> activity, Func<ActivityExecutionContext, ValueTask<IEnumerable<string>?>> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcomes(this ISetupActivity<Finish> activity, Func<ActivityExecutionContext, IEnumerable<string>> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcomes(this ISetupActivity<Finish> activity, Func<IEnumerable<string>> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcomes(this ISetupActivity<Finish> activity, IEnumerable<string> value) => activity.Set(x => x.OutcomeNames, value);
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, Func<ActivityExecutionContext, ValueTask<string>> value) => activity.WithOutcomes(async x => new[] { await value(x) });
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, Func<ActivityExecutionContext, string> value) => activity.WithOutcomes(x => new[] { value(x) });
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, Func<string> value) => activity.WithOutcomes(() => new[] { value() });
public static ISetupActivity<Finish> WithOutcome(this ISetupActivity<Finish> activity, string value) => activity.WithOutcomes(new[] { value });
}
}

View file

@ -23,6 +23,8 @@ namespace Elsa.Samples.ProgrammaticCompositeActivitiesConsole.Activities
public override void Build(ICompositeActivityBuilder activity)
{
activity
// IMPORTANT: Notice that we need to get the "parent" state to get the `Start` value, since here we are in a different context than the CountDownActivity itself.
// Accessing `Start` directly would return the captured value at the time this `Build` method executed when creating workflow blueprints.
.For(context => context.GetParentState<int>(nameof(Start)), _ => 0, _ => -1, iterate =>
{
iterate.WriteLine(context => $"{context.GetInput<int>()}...");

View file

@ -7,6 +7,6 @@ namespace Elsa.Core.IntegrationTests.Workflows
{
private readonly object _output;
public FinishWorkflow(object output) => _output = output;
public void Build(IWorkflowBuilder builder) => builder.Finish(_output);
public void Build(IWorkflowBuilder builder) => builder.Finish(finish => finish.WithOutput(_output));
}
}