45 lines
935 B
Go
45 lines
935 B
Go
package fsm
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
// Visualize outputs a visualization of a FSM in Graphviz format.
|
|
func Visualize(fsm *FSM) string {
|
|
var buf bytes.Buffer
|
|
|
|
states := make(map[string]int)
|
|
|
|
buf.WriteString(fmt.Sprintf(`digraph fsm {`))
|
|
buf.WriteString("\n")
|
|
|
|
// make sure the initial state is at top
|
|
for k, v := range fsm.transitions {
|
|
if k.src == fsm.current {
|
|
states[k.src]++
|
|
states[v]++
|
|
buf.WriteString(fmt.Sprintf(` "%s" -> "%s" [ label = "%s" ];`, k.src, v, k.event))
|
|
buf.WriteString("\n")
|
|
}
|
|
}
|
|
|
|
for k, v := range fsm.transitions {
|
|
if k.src != fsm.current {
|
|
states[k.src]++
|
|
states[v]++
|
|
buf.WriteString(fmt.Sprintf(` "%s" -> "%s" [ label = "%s" ];`, k.src, v, k.event))
|
|
buf.WriteString("\n")
|
|
}
|
|
}
|
|
|
|
buf.WriteString("\n")
|
|
|
|
for k := range states {
|
|
buf.WriteString(fmt.Sprintf(` "%s";`, k))
|
|
buf.WriteString("\n")
|
|
}
|
|
buf.WriteString(fmt.Sprintln("}"))
|
|
|
|
return buf.String()
|
|
}
|