diff --git a/samples/Sample04.ResultTransitions/Program.cs b/samples/Sample04.ResultTransitions/Program.cs index 0cb79dd..716ed1d 100644 --- a/samples/Sample04.ResultTransitions/Program.cs +++ b/samples/Sample04.ResultTransitions/Program.cs @@ -1,12 +1,95 @@ // Copyright Xeno Innovations, Inc. 2026 // See the LICENSE file in the project root for more information. +using Lite.StateMachine; + namespace Sample04.ResultTransitions; -internal class Program +/// State definitions. +public enum StateId +{ + State1, + State2, + State3, +} + +public class Program { - private static void Main(string[] args) + private static async Task Main(string[] args) + { + await ResultsStateMachine.RunAsync(); + } +} + +[System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:File may only contain a single type", Justification = "Ignore")] +public class ResultsStateMachine +{ + /// Example asynchronous run method. + /// Task. + public static async Task RunAsync() + { + var machine = new StateMachine(); + machine.RegisterState(StateId.State1, onSuccess: StateId.State1, onError: StateId.State2, onFailure: null, subscriptionTypes: null); + machine.RegisterState(StateId.State2, onSuccess: StateId.State1, onError: null, onFailure: StateId.State3, subscriptionTypes: null); + machine.RegisterState(StateId.State3, subscriptionTypes: null); + + // Async Example! + await machine.RunAsync(StateId.State1); + } + + public class State1 : IState + { + public Task OnEnter(Context context) + { + // Set Error so we can continue. + context.NextState(Result.Error); + + Console.WriteLine($"[State1][OnEnter].OnSuccess goto: '{context.NextStates.OnSuccess}'"); + Console.WriteLine($"[State1][OnEnter].OnError goto: '{context.NextStates.OnError}'"); + Console.WriteLine($"[State1][OnEnter].OnFailure goto: '{context.NextStates.OnFailure}'"); + return Task.CompletedTask; + } + + public Task OnEntering(Context context) => Task.CompletedTask; + + public Task OnExit(Context context) => Task.CompletedTask; + } + + public class State2 : IState { - Console.WriteLine("Coming Soon!"); + public Task OnEnter(Context context) + { + // Set Success so we can continue. + context.NextState(Result.Error); + + Console.WriteLine($"[State2][OnEnter].OnSuccess goto: '{context.NextStates.OnSuccess}'"); + Console.WriteLine($"[State2][OnEnter].OnError goto: '{context.NextStates.OnError}'"); + Console.WriteLine($"[State2][OnEnter].OnFailure goto: '{context.NextStates.OnFailure}'"); + + return Task.CompletedTask; + } + + public Task OnEntering(Context context) => Task.CompletedTask; + + public Task OnExit(Context context) => Task.CompletedTask; + } + + public class State3 : IState + { + public Task OnEnter(Context context) + { + // Set Failure so we can continue. + context.NextState(Result.Success); + + Console.WriteLine($"[State3][OnEnter].OnSuccess goto: '{context.NextStates.OnSuccess}'"); + Console.WriteLine($"[State3][OnEnter].OnError goto: '{context.NextStates.OnError}'"); + Console.WriteLine($"[State3][OnEnter].OnFailure goto: '{context.NextStates.OnFailure}'"); + + return Task.CompletedTask; + } + + public Task OnEntering(Context context) => Task.CompletedTask; + + public Task OnExit(Context context) => Task.CompletedTask; } } diff --git a/samples/Sample04.ResultTransitions/Sample04.ResultTransitions.csproj b/samples/Sample04.ResultTransitions/Sample04.ResultTransitions.csproj index ed9781c..c3ee00d 100644 --- a/samples/Sample04.ResultTransitions/Sample04.ResultTransitions.csproj +++ b/samples/Sample04.ResultTransitions/Sample04.ResultTransitions.csproj @@ -7,4 +7,8 @@ enable + + + +