alternate.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. ll "github.com/looplab/fsm"
  7. )
  8. func isNoTransitionError(err error) bool {
  9. var noTransitionError ll.NoTransitionError
  10. return errors.As(err, &noTransitionError)
  11. }
  12. func main() {
  13. fsm := ll.NewFSM(
  14. "idle",
  15. ll.Events{
  16. {Name: "scan", Src: []string{"idle"}, Dst: "scanning"},
  17. {Name: "working", Src: []string{"scanning"}, Dst: "scanning"},
  18. {Name: "situation", Src: []string{"scanning"}, Dst: "scanning"},
  19. {Name: "situation", Src: []string{"idle"}, Dst: "idle"},
  20. {Name: "finish", Src: []string{"scanning"}, Dst: "idle"},
  21. },
  22. ll.Callbacks{
  23. "scan": func(_ context.Context, e *ll.Event) {
  24. fmt.Println("after_scan: " + e.FSM.Current())
  25. },
  26. "working": func(_ context.Context, e *ll.Event) {
  27. fmt.Println("working: " + e.FSM.Current())
  28. },
  29. "situation": func(_ context.Context, e *ll.Event) {
  30. fmt.Println("situation: " + e.FSM.Current())
  31. },
  32. "finish": func(_ context.Context, e *ll.Event) {
  33. fmt.Println("finish: " + e.FSM.Current())
  34. },
  35. },
  36. )
  37. fmt.Println(fsm.Current())
  38. err := fsm.Event(context.Background(), "scan")
  39. if err != nil {
  40. fmt.Println(err)
  41. }
  42. fmt.Println("1:" + fsm.Current())
  43. err = fsm.Event(context.Background(), "working")
  44. if err != nil && !isNoTransitionError(err) {
  45. fmt.Println(err)
  46. }
  47. fmt.Println("2:" + fsm.Current())
  48. err = fsm.Event(context.Background(), "situation")
  49. if err != nil && !isNoTransitionError(err) {
  50. fmt.Println(err)
  51. }
  52. fmt.Println("3:" + fsm.Current())
  53. err = fsm.Event(context.Background(), "finish")
  54. if err != nil && !isNoTransitionError(err) {
  55. fmt.Println(err)
  56. }
  57. fmt.Println("4:" + fsm.Current())
  58. }