@@ -8,68 +8,92 @@ class Program
88{
99 static void Main ( )
1010 {
11- var registry = new TransitionRegistry < TicketContext > ( ) ;
12- registry . RegisterCondition ( "HasAgent" , ctx => ctx . IsAgentAssigned ) ;
13- registry . RegisterCondition ( "Confirmed" , ctx => ctx . IsCustomerConfirmed ) ;
14- registry . RegisterSideEffect ( "NotifyCustomer" , ctx => Console . WriteLine ( "Customer notified" ) ) ;
15-
16- var builder = FiniteStateMachineBuilder < TicketState , TicketContext > . Create ( "Ticket" )
17- . WithInitialState ( TicketState . Open )
18- . AddTransition ( TicketState . Open , TicketState . InProgress )
19- . When ( registry . Conditions [ "HasAgent" ] , "HasAgent" )
20- . WithSideEffect ( registry . SideEffects [ "NotifyCustomer" ] , "NotifyCustomer" )
11+ var registry = new TransitionRegistry < OrderContext > ( ) ;
12+ registry . RegisterCondition ( "PaymentReceived" , ctx => ctx . PaymentReceived ) ;
13+ registry . RegisterCondition ( "PackingComplete" , ctx => ctx . PackingComplete ) ;
14+ registry . RegisterCondition ( "Shipped" , ctx => ctx . Shipped ) ;
15+ registry . RegisterCondition ( "Delivered" , ctx => ctx . Delivered ) ;
16+ registry . RegisterCondition ( "CancelRequested" , ctx => ctx . CancelRequested ) ;
17+ registry . RegisterCondition ( "ReturnRequested" , ctx => ctx . ReturnRequested ) ;
18+
19+ registry . RegisterSideEffect ( "NotifyShipment" , ctx => Console . WriteLine ( "Customer notified: Order shipped" ) ) ;
20+ registry . RegisterSideEffect ( "NotifyDelivery" , ctx => Console . WriteLine ( "Customer notified: Order delivered" ) ) ;
21+ registry . RegisterSideEffect ( "NotifyCancel" , ctx => Console . WriteLine ( "Customer notified: Order cancelled" ) ) ;
22+ registry . RegisterSideEffect ( "NotifyReturn" , ctx => Console . WriteLine ( "Customer notified: Order returned" ) ) ;
23+
24+ var builder = FiniteStateMachineBuilder < OrderState , OrderContext > . Create ( "Order" )
25+ . WithInitialState ( OrderState . Created )
26+ . AddTransition ( OrderState . Created , OrderState . Paid )
27+ . When ( registry . Conditions [ "PaymentReceived" ] , "PaymentReceived" )
28+ . Done ( )
29+ . AddTransition ( OrderState . Paid , OrderState . Packed )
30+ . When ( registry . Conditions [ "PackingComplete" ] , "PackingComplete" )
31+ . Done ( )
32+ . AddTransition ( OrderState . Packed , OrderState . Shipped )
33+ . When ( registry . Conditions [ "Shipped" ] , "Shipped" )
34+ . WithSideEffect ( registry . SideEffects [ "NotifyShipment" ] , "NotifyShipment" )
35+ . Done ( )
36+ . AddTransition ( OrderState . Shipped , OrderState . Delivered )
37+ . When ( registry . Conditions [ "Delivered" ] , "Delivered" )
38+ . WithSideEffect ( registry . SideEffects [ "NotifyDelivery" ] , "NotifyDelivery" )
39+ . Done ( )
40+ . AddTransition ( OrderState . Created , OrderState . Cancelled )
41+ . When ( registry . Conditions [ "CancelRequested" ] , "CancelRequested" )
42+ . WithSideEffect ( registry . SideEffects [ "NotifyCancel" ] , "NotifyCancel" )
43+ . Done ( )
44+ . AddTransition ( OrderState . Paid , OrderState . Cancelled )
45+ . When ( registry . Conditions [ "CancelRequested" ] , "CancelRequested" )
46+ . WithSideEffect ( registry . SideEffects [ "NotifyCancel" ] , "NotifyCancel" )
47+ . Done ( )
48+ . AddTransition ( OrderState . Packed , OrderState . Cancelled )
49+ . When ( registry . Conditions [ "CancelRequested" ] , "CancelRequested" )
50+ . WithSideEffect ( registry . SideEffects [ "NotifyCancel" ] , "NotifyCancel" )
51+ . Done ( )
52+ . AddTransition ( OrderState . Shipped , OrderState . Cancelled )
53+ . When ( registry . Conditions [ "CancelRequested" ] , "CancelRequested" )
54+ . WithSideEffect ( registry . SideEffects [ "NotifyCancel" ] , "NotifyCancel" )
2155 . Done ( )
22- . AddTransition ( TicketState . InProgress , TicketState . Resolved )
23- . When ( registry . Conditions [ "Confirmed" ] , "Confirmed" )
56+ . AddTransition ( OrderState . Delivered , OrderState . Returned )
57+ . When ( registry . Conditions [ "ReturnRequested" ] , "ReturnRequested" )
58+ . WithSideEffect ( registry . SideEffects [ "NotifyReturn" ] , "NotifyReturn" )
2459 . Done ( ) ;
2560
26- var definition = builder . Build ( ) ;
27-
28- var serializable = builder . ToSerializable ( ) ;
29-
30- // JSON using System.Text.Json
31- string json = JsonSerializer . Serialize ( serializable , new JsonSerializerOptions { WriteIndented = true } ) ;
32-
33- // YAML using YamlDotNet
34- var yamlSerializer = new YamlDotNet . Serialization . Serializer ( ) ;
35- string yaml = yamlSerializer . Serialize ( serializable ) ;
36-
37- // From JSON
38- var jsonDto = JsonSerializer . Deserialize < SerializableStateMachine > ( json ) ! ;
39-
40- // From YAML
41- var yamlDeserializer = new YamlDotNet . Serialization . Deserializer ( ) ;
42- var yamlDto = yamlDeserializer . Deserialize < SerializableStateMachine > ( new StringReader ( yaml ) ) ;
43-
44- // Rebuild FSM
45- var loadedBuilder = FiniteStateMachineBuilder < TicketState , TicketContext > . Create ( jsonDto . EntityType )
46- . LoadFrom ( jsonDto , registry ) ;
47-
48- var loadedFsm = loadedBuilder . Build ( ) ;
61+ var fsm = new FiniteStateMachine < OrderState , OrderContext > ( builder . Build ( ) ) ;
4962
50- // Runtime FSM Usage
51- var sm = new FiniteStateMachine < TicketState , TicketContext > ( loadedFsm ) ;
52- var context = new TicketContext { IsAgentAssigned = true , IsCustomerConfirmed = false } ;
63+ var context = new OrderContext { PaymentReceived = true } ;
64+ fsm . TryTransitionTo ( OrderState . Paid , context ) ; // Moves to Paid
5365
54- Console . WriteLine ( $ "Current: { sm . Current } ") ; // Open
66+ context . PackingComplete = true ;
67+ fsm . TryTransitionTo ( OrderState . Packed , context ) ; // Moves to Packed
5568
56- if ( sm . TryTransitionTo ( TicketState . InProgress , context ) )
57- Console . WriteLine ( $ "Now: { sm . Current } " ) ; // InProgress
69+ context . Shipped = true ;
70+ fsm . TryTransitionTo ( OrderState . Shipped , context ) ; // Moves to Shipped, notifies shipment
5871
72+ context . Delivered = true ;
73+ fsm . TryTransitionTo ( OrderState . Delivered , context ) ; // Moves to Delivered, notifies delivery
5974
75+ context . ReturnRequested = true ;
76+ fsm . TryTransitionTo ( OrderState . Returned , context ) ; // Moves to Returned, notifies return
6077 }
6178}
6279
63- public enum TicketState
80+ public enum OrderState
6481{
65- Open ,
66- InProgress ,
67- Resolved ,
68- Closed
82+ Created ,
83+ Paid ,
84+ Packed ,
85+ Shipped ,
86+ Delivered ,
87+ Cancelled ,
88+ Returned
6989}
7090
71- public class TicketContext
91+ public class OrderContext
7292{
73- public bool IsAgentAssigned { get ; set ; }
74- public bool IsCustomerConfirmed { get ; set ; }
93+ public bool PaymentReceived { get ; set ; }
94+ public bool PackingComplete { get ; set ; }
95+ public bool Shipped { get ; set ; }
96+ public bool Delivered { get ; set ; }
97+ public bool CancelRequested { get ; set ; }
98+ public bool ReturnRequested { get ; set ; }
7599}
0 commit comments