| | | 1 | | namespace Nabs.ActivityFramework; |
| | | 2 | | |
| | | 3 | | public abstract class Workflow<TWorkflowState> |
| | | 4 | | where TWorkflowState : class, IWorkflowState |
| | | 5 | | { |
| | | 6 | | public TWorkflowState? WorkflowState { get; set; } |
| | 0 | 7 | | public Dictionary<IActivity, Delegate?> Activities { get; } = []; |
| | | 8 | | |
| | | 9 | | public bool Processed { get; private set; } |
| | | 10 | | |
| | | 11 | | public ValidationResult ValidationResult |
| | | 12 | | { |
| | | 13 | | get |
| | | 14 | | { |
| | 0 | 15 | | if (!Processed) |
| | | 16 | | { |
| | 0 | 17 | | return null!; |
| | | 18 | | } |
| | | 19 | | |
| | 0 | 20 | | var allFailures = Activities |
| | 0 | 21 | | .Where(x => x.Key.ValidationResult != null) |
| | 0 | 22 | | .SelectMany(x => x.Key.ValidationResult.Errors) |
| | 0 | 23 | | .ToList(); |
| | | 24 | | |
| | 0 | 25 | | return new ValidationResult(allFailures); |
| | | 26 | | } |
| | | 27 | | } |
| | | 28 | | |
| | | 29 | | protected void AddActivity<TActivity>(Action<TActivity>? action = null) |
| | | 30 | | where TActivity : class, IActivity, new() |
| | | 31 | | { |
| | 0 | 32 | | var activity = new TActivity(); |
| | 0 | 33 | | Activities.Add(activity, action); |
| | 0 | 34 | | } |
| | | 35 | | |
| | | 36 | | protected void AddActivity<TActivity>(IActivity activity, Action<TActivity>? action = null) |
| | | 37 | | where TActivity : class, IActivity |
| | | 38 | | { |
| | 0 | 39 | | Activities.Add(activity, action); |
| | 0 | 40 | | } |
| | | 41 | | |
| | | 42 | | public async Task RunAsync() |
| | | 43 | | { |
| | 0 | 44 | | Processed = false; |
| | 0 | 45 | | await ProcessActivitiesAsync(); |
| | 0 | 46 | | Processed = true; |
| | 0 | 47 | | } |
| | | 48 | | |
| | | 49 | | private async Task ProcessActivitiesAsync() |
| | | 50 | | { |
| | 0 | 51 | | foreach (var activity in Activities) |
| | | 52 | | { |
| | 0 | 53 | | await activity.Key.RunAsync(); |
| | 0 | 54 | | activity.Value?.DynamicInvoke(activity.Key); |
| | 0 | 55 | | } |
| | 0 | 56 | | } |
| | | 57 | | } |