-
Notifications
You must be signed in to change notification settings - Fork 0
/
node.go
78 lines (66 loc) · 1.47 KB
/
node.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package workflowmodel
import (
"encoding/json"
"strings"
)
type Node struct {
Name string
Parent *Node
Children []*Node
Status NodeStatus
}
func (node *Node) AddChild(child *Node) {
node.Children = append(node.Children, child)
child.Parent = node
}
func (node *Node) NodePath() string {
var nodeList []string
currentNode := node
for currentNode != nil {
nodeList = append([]string{currentNode.Name}, nodeList...)
currentNode = currentNode.Parent
}
path := strings.Join(nodeList, "/")
if path == "" {
path = "/"
}
return path
}
type nodeDict struct {
Name string `json:"name"`
Status int `json:"status"`
Children []nodeDict `json:"children"`
}
func (node *Node) toNodeDict() nodeDict {
childrenDict := make([]nodeDict, 0)
for _, child := range node.Children {
childrenDict = append(childrenDict, child.toNodeDict())
}
return nodeDict{
Name: node.Name,
Status: int(node.Status),
Children: childrenDict,
}
}
func createFromNodeDict(d nodeDict) Node {
var node Node
node.Name = d.Name
node.Status = NodeStatus(d.Status)
for _, c := range d.Children {
cNode := createFromNodeDict(c)
node.Children = append(node.Children, &cNode)
}
return node
}
func (node Node) MarshalJSON() ([]byte, error) {
d := node.toNodeDict()
return json.Marshal(&d)
}
func (node *Node) UnmarshalJSON(b []byte) error {
var d nodeDict
if err := json.Unmarshal(b, &d); err != nil {
return err
}
*node = createFromNodeDict(d)
return nil
}