dive-zfs/filetree.go
2018-05-21 23:17:32 -04:00

71 lines
1.2 KiB
Go

package main
import (
"errors"
"strings"
)
type FileTree interface {
AddPath(string, interface{})
RemovePath(string)
Visit(Visiter)
}
type Visiter func(*Node)
func (tree *Tree) Visit(visiter Visiter) {
tree.root.Visit(visiter)
}
func (node *Node) Visit(visiter Visiter) {
for _, child := range node.children {
child.Visit(visiter)
}
visiter(node)
}
func (tree *Tree) AddPath(path string, data interface{}) (*Node, error) {
nodeNames := strings.Split(path, "/")
node := tree.Root()
var err error
for idx, name := range nodeNames {
if name == "" {
continue
}
// find or create node
if node.children[name] != nil {
node = node.children[name]
} else {
node, _ = node.AddChild(name, nil)
if err != nil {
return node, err
}
}
// attach payload
if idx == len(nodeNames)-1 {
node.data = data
}
}
return node, nil
}
func (tree *Tree) RemovePath(path string) error {
nodeNames := strings.Split(path, "/")
node := tree.Root()
for _, name := range nodeNames {
if name == "" {
continue
}
if node.children[name] == nil {
return errors.New("Path does not exist")
}
node = node.children[name]
}
// this node's parent should be a leaf
return node.Remove()
}