diff --git a/fsm/stateparser/stateparser.go b/fsm/stateparser/stateparser.go index f1e78ab1..0e11b5c0 100644 --- a/fsm/stateparser/stateparser.go +++ b/fsm/stateparser/stateparser.go @@ -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 { diff --git a/instantout/reservation/reservation_fsm.md b/instantout/reservation/reservation_fsm.md index 1eefb5c6..6a48d367 100644 --- a/instantout/reservation/reservation_fsm.md +++ b/instantout/reservation/reservation_fsm.md @@ -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 ``` \ No newline at end of file diff --git a/scripts/fsm-generate.sh b/scripts/fsm-generate.sh index 4ab2d74c..0f78fc76 100755 --- a/scripts/fsm-generate.sh +++ b/scripts/fsm-generate.sh @@ -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 \ No newline at end of file +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