struct.go 822 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. //go:build ignore
  2. // +build ignore
  3. package main
  4. import (
  5. "context"
  6. "fmt"
  7. "github.com/looplab/fsm"
  8. )
  9. type Door struct {
  10. To string
  11. FSM *fsm.FSM
  12. }
  13. func NewDoor(to string) *Door {
  14. d := &Door{
  15. To: to,
  16. }
  17. d.FSM = fsm.NewFSM(
  18. "closed",
  19. fsm.Events{
  20. {Name: "open", Src: []string{"closed"}, Dst: "open"},
  21. {Name: "close", Src: []string{"open"}, Dst: "closed"},
  22. },
  23. fsm.Callbacks{
  24. "enter_state": func(_ context.Context, e *fsm.Event) { d.enterState(e) },
  25. },
  26. )
  27. return d
  28. }
  29. func (d *Door) enterState(e *fsm.Event) {
  30. fmt.Printf("The door to %s is %s\n", d.To, e.Dst)
  31. }
  32. func main() {
  33. door := NewDoor("heaven")
  34. err := door.FSM.Event(context.Background(), "open")
  35. if err != nil {
  36. fmt.Println(err)
  37. }
  38. err = door.FSM.Event(context.Background(), "close")
  39. if err != nil {
  40. fmt.Println(err)
  41. }
  42. }