gfsm
is a finite state machine in Golang.
go get github.com/Focinfi/gfsm
If you are designing a Order struct
import "github.com/Focinfi/gfsm"
// design all order's states
const (
orderPending = "pending"
orderPaid = "paid"
orderShipped = "shipped"
)
// create a new StateMachine
var OrderStateMachine = gfsm.NewStateMachine(orderPending, orderPaid, orderShipped)
// add a pay event for OrderStateMachine
OrderStateMachine.Event("pay").Transition(orderPaid, orderPending)
OrderStateMachine.Event("ship").Transition(orderShipped, orderPaid)
// can only add state among in orderPending, orderPaid, orderShipped, or will return a non-nil error
err := OrderStateMachine.Event("cancel").Transition(orderShipped, "unknown")
// compose gfsm.State pointer into Order struct
type Order struct {
Name string
*gfsm.State
}
// create new object with OrderStateMachine
var order = &Order{Name: "order", State: gfsm.NewState(orderPending, OrderStateMachine)}
// get the current state
order.CurrentState() // "pending"
// trigger the pay event
if err := order.Trigger("pay"); err != nil {
// do something when this order can not pay.
} else {
order.CurrentState() // "paid"
// do something when this order can pay
}