[VOL-4023] openonuAdapterGo - Ani side configuration fails while waiting for FlowDeletion, and upgrade looplab/fsm

Signed-off-by: mpagenko <michael.pagenkopf@adtran.com>
Change-Id: I9053d2ee774ff46c6d3a9cff5743a141bf14ad58
diff --git a/vendor/github.com/looplab/fsm/mermaid_visualizer.go b/vendor/github.com/looplab/fsm/mermaid_visualizer.go
new file mode 100644
index 0000000..7f2887a
--- /dev/null
+++ b/vendor/github.com/looplab/fsm/mermaid_visualizer.go
@@ -0,0 +1,89 @@
+package fsm
+
+import (
+	"bytes"
+	"fmt"
+)
+
+const highlightingColor = "#00AA00"
+
+// MermaidDiagramType the type of the mermaid diagram type
+type MermaidDiagramType string
+
+const (
+	// FlowChart the diagram type for output in flowchart style (https://mermaid-js.github.io/mermaid/#/flowchart) (including current state)
+	FlowChart MermaidDiagramType = "flowChart"
+	// StateDiagram the diagram type for output in stateDiagram style (https://mermaid-js.github.io/mermaid/#/stateDiagram)
+	StateDiagram MermaidDiagramType = "stateDiagram"
+)
+
+// VisualizeForMermaidWithGraphType outputs a visualization of a FSM in Mermaid format as specified by the graphType.
+func VisualizeForMermaidWithGraphType(fsm *FSM, graphType MermaidDiagramType) (string, error) {
+	switch graphType {
+	case FlowChart:
+		return visualizeForMermaidAsFlowChart(fsm), nil
+	case StateDiagram:
+		return visualizeForMermaidAsStateDiagram(fsm), nil
+	default:
+		return "", fmt.Errorf("unknown MermaidDiagramType: %s", graphType)
+	}
+}
+
+func visualizeForMermaidAsStateDiagram(fsm *FSM) string {
+	var buf bytes.Buffer
+
+	sortedTransitionKeys := getSortedTransitionKeys(fsm.transitions)
+
+	buf.WriteString("stateDiagram\n")
+	buf.WriteString(fmt.Sprintln(`    [*] -->`, fsm.current))
+
+	for _, k := range sortedTransitionKeys {
+		v := fsm.transitions[k]
+		buf.WriteString(fmt.Sprintf(`    %s --> %s: %s`, k.src, v, k.event))
+		buf.WriteString("\n")
+	}
+
+	return buf.String()
+}
+
+// visualizeForMermaidAsFlowChart outputs a visualization of a FSM in Mermaid format (including highlighting of current state).
+func visualizeForMermaidAsFlowChart(fsm *FSM) string {
+	var buf bytes.Buffer
+
+	sortedTransitionKeys := getSortedTransitionKeys(fsm.transitions)
+	sortedStates, statesToIDMap := getSortedStates(fsm.transitions)
+
+	writeFlowChartGraphType(&buf)
+	writeFlowChartStates(&buf, sortedStates, statesToIDMap)
+	writeFlowChartTransitions(&buf, fsm.transitions, sortedTransitionKeys, statesToIDMap)
+	writeFlowChartHightlightCurrent(&buf, fsm.current, statesToIDMap)
+
+	return buf.String()
+}
+
+func writeFlowChartGraphType(buf *bytes.Buffer) {
+	buf.WriteString("graph LR\n")
+}
+
+func writeFlowChartStates(buf *bytes.Buffer, sortedStates []string, statesToIDMap map[string]string) {
+	for _, state := range sortedStates {
+		buf.WriteString(fmt.Sprintf(`    %s[%s]`, statesToIDMap[state], state))
+		buf.WriteString("\n")
+	}
+
+	buf.WriteString("\n")
+}
+
+func writeFlowChartTransitions(buf *bytes.Buffer, transitions map[eKey]string, sortedTransitionKeys []eKey, statesToIDMap map[string]string) {
+	for _, transition := range sortedTransitionKeys {
+		target := transitions[transition]
+		buf.WriteString(fmt.Sprintf(`    %s --> |%s| %s`, statesToIDMap[transition.src], transition.event, statesToIDMap[target]))
+		buf.WriteString("\n")
+	}
+	buf.WriteString("\n")
+}
+
+func writeFlowChartHightlightCurrent(buf *bytes.Buffer, current string, statesToIDMap map[string]string) {
+	buf.WriteString(fmt.Sprintf(`    style %s fill:%s`, statesToIDMap[current], highlightingColor))
+	buf.WriteString("\n")
+}