fsm: harden diagram generation

This commit is contained in:
Gustavo Stingelin 2026-07-18 15:33:19 -03:00
parent 1d5b1c564a
commit e77a1ab634
3 changed files with 39 additions and 28 deletions

View file

@ -14,6 +14,8 @@ import (
"github.com/lightninglabs/loop/instantout/reservation"
)
var errInvalidFSMSelector = errors.New("missing or unknown fsm selector")
func main() {
if err := run(); err != nil {
fmt.Println(err)
@ -35,35 +37,34 @@ func run() error {
return err
}
switch *stateMachine {
states, err := getStates(*stateMachine)
if err != nil {
return err
}
return writeMermaidFile(fp, states)
}
func getStates(stateMachine string) (fsm.States, error) {
switch stateMachine {
case "example":
exampleFSM := &fsm.ExampleFSM{}
err = writeMermaidFile(fp, exampleFSM.GetStates())
if err != nil {
return err
}
return exampleFSM.GetStates(), nil
case "reservation":
reservationFSM := &reservation.FSM{}
err = writeMermaidFile(fp, reservationFSM.GetServerInitiatedReservationStates())
if err != nil {
return err
}
return reservationFSM.GetServerInitiatedReservationStates(), nil
case "instantout":
instantout := &instantout.FSM{}
err = writeMermaidFile(fp, instantout.GetV1ReservationStates())
if err != nil {
return err
}
instantOutFSM := &instantout.FSM{}
return instantOutFSM.GetV1ReservationStates(), nil
default:
fmt.Println("Missing or wrong argument: fsm must be one of:")
fmt.Println("\treservations")
fmt.Println("\texample")
return nil, fmt.Errorf(
"%w %q; supported selectors: example, instantout, reservation",
errInvalidFSMSelector, stateMachine,
)
}
return nil
}
func writeMermaidFile(filename string, states fsm.States) error {

View file

@ -2,20 +2,28 @@
stateDiagram-v2
[*] --> Init: OnServerRequest
Confirmed
Confirmed --> SpendBroadcasted: OnSpendBroadcasted
Confirmed --> TimedOut: OnTimedOut
Confirmed --> Confirmed: OnError
Confirmed --> Locked: OnLocked
Confirmed --> Confirmed: OnRecover
Confirmed --> Spent: OnSpent
Confirmed --> TimedOut: OnTimedOut
Failed
Init
Init --> WaitForConfirmation: OnBroadcast
Init --> Failed: OnRecover
Init --> Failed: OnError
SpendBroadcasted
SpendBroadcasted --> SpendConfirmed: OnSpendConfirmed
SpendConfirmed
Init --> Failed: OnRecover
Locked
Locked --> Locked: OnError
Locked --> Locked: OnRecover
Locked --> Spent: OnSpent
Locked --> TimedOut: OnTimedOut
Locked --> Confirmed: OnUnlocked
Spent
Spent --> Spent: OnSpent
TimedOut
TimedOut --> TimedOut: OnTimedOut
WaitForConfirmation
WaitForConfirmation --> WaitForConfirmation: OnRecover
WaitForConfirmation --> Confirmed: OnConfirmed
WaitForConfirmation --> WaitForConfirmation: OnRecover
WaitForConfirmation --> TimedOut: OnTimedOut
```

View file

@ -1,4 +1,6 @@
#!/usr/bin/env bash
set -euo pipefail
go run ./fsm/stateparser/stateparser.go --out ./fsm/example_fsm.md --fsm example
go run ./fsm/stateparser/stateparser.go --out ./reservation/reservation_fsm.md --fsm reservation
go run ./fsm/stateparser/stateparser.go --out ./instantout/fsm.md --fsm instantout
go run ./fsm/stateparser/stateparser.go --out ./instantout/reservation/reservation_fsm.md --fsm reservation
go run ./fsm/stateparser/stateparser.go --out ./instantout/fsm.md --fsm instantout