mirror of https://github.com/docker/docs.git
beam.Tree: plumbing for an in-memory object tree
Signed-off-by: Solomon Hykes <solomon@docker.com>
This commit is contained in:
parent
ef69ac0858
commit
88828b27b8
|
|
@ -0,0 +1,44 @@
|
|||
package beam
|
||||
|
||||
import (
|
||||
"sort"
|
||||
)
|
||||
|
||||
type Tree struct {
|
||||
*Server
|
||||
children map[string]Sender
|
||||
}
|
||||
|
||||
func NewTree() *Tree {
|
||||
t := &Tree{
|
||||
Server: NewServer(),
|
||||
children: make(map[string]Sender),
|
||||
}
|
||||
t.OnAttach(Handler(func(msg *Message) error {
|
||||
if len(msg.Args) == 0 || msg.Args[0] == "" {
|
||||
msg.Ret.Send(&Message{Name: "ack", Ret: t})
|
||||
return nil
|
||||
}
|
||||
if child, exists := t.children[msg.Args[0]]; exists {
|
||||
msg.Ret.Send(&Message{Name: "ack", Ret: child})
|
||||
return nil
|
||||
}
|
||||
Obj(msg.Ret).Error("not found")
|
||||
return nil
|
||||
}))
|
||||
t.OnLs(Handler(func(msg *Message) error {
|
||||
names := make([]string, 0, len(t.children))
|
||||
for name := range t.children {
|
||||
names = append(names, name)
|
||||
}
|
||||
sort.Strings(names)
|
||||
Obj(msg.Ret).Set(names...)
|
||||
return nil
|
||||
}))
|
||||
return t
|
||||
}
|
||||
|
||||
func (t *Tree) Bind(name string, dst Sender) *Tree {
|
||||
t.children[name] = dst
|
||||
return t
|
||||
}
|
||||
Loading…
Reference in New Issue