package main import ( "context" "errors" "fmt" ll "github.com/looplab/fsm" ) func isNoTransitionError(err error) bool { var noTransitionError ll.NoTransitionError return errors.As(err, &noTransitionError) } func main() { fsm := ll.NewFSM( "idle", ll.Events{ {Name: "scan", Src: []string{"idle"}, Dst: "scanning"}, {Name: "working", Src: []string{"scanning"}, Dst: "scanning"}, {Name: "situation", Src: []string{"scanning"}, Dst: "scanning"}, {Name: "situation", Src: []string{"idle"}, Dst: "idle"}, {Name: "finish", Src: []string{"scanning"}, Dst: "idle"}, }, ll.Callbacks{ "scan": func(_ context.Context, e *ll.Event) { fmt.Println("after_scan: " + e.FSM.Current()) }, "working": func(_ context.Context, e *ll.Event) { fmt.Println("working: " + e.FSM.Current()) }, "situation": func(_ context.Context, e *ll.Event) { fmt.Println("situation: " + e.FSM.Current()) }, "finish": func(_ context.Context, e *ll.Event) { fmt.Println("finish: " + e.FSM.Current()) }, }, ) fmt.Println(fsm.Current()) err := fsm.Event(context.Background(), "scan") if err != nil { fmt.Println(err) } fmt.Println("1:" + fsm.Current()) err = fsm.Event(context.Background(), "working") if err != nil && !isNoTransitionError(err) { fmt.Println(err) } fmt.Println("2:" + fsm.Current()) err = fsm.Event(context.Background(), "situation") if err != nil && !isNoTransitionError(err) { fmt.Println(err) } fmt.Println("3:" + fsm.Current()) err = fsm.Event(context.Background(), "finish") if err != nil && !isNoTransitionError(err) { fmt.Println(err) } fmt.Println("4:" + fsm.Current()) }