123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- 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())
- }
|