You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
935 B
45 lines
935 B
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() |
|
}
|
|
|