37 lines
760 B
Go
37 lines
760 B
Go
package tree
|
|
|
|
type Node struct {
|
|
Name string
|
|
IsDir bool
|
|
Children map[string]*Node
|
|
Annotation string
|
|
Ref string
|
|
}
|
|
|
|
func splitPath(relPath string) []string {
|
|
var parts []string
|
|
start := 0
|
|
for i := 0; i <= len(relPath); i++ {
|
|
if i == len(relPath) || relPath[i] == '/' || relPath[i] == '\\' {
|
|
if i > start {
|
|
parts = append(parts, relPath[start:i])
|
|
}
|
|
start = i + 1
|
|
}
|
|
}
|
|
return parts
|
|
}
|
|
|
|
func addPath(root *Node, rel string, isDir bool) *Node {
|
|
parts := splitPath(rel)
|
|
cur := root
|
|
for i, part := range parts {
|
|
if _, ok := cur.Children[part]; !ok {
|
|
cur.Children[part] = &Node{Name: part, IsDir: i < len(parts)-1, Children: make(map[string]*Node)}
|
|
}
|
|
cur = cur.Children[part]
|
|
}
|
|
cur.IsDir = isDir
|
|
return cur
|
|
}
|