123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- 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()
- }
|