diff --git a/beam/tree.go b/beam/tree.go new file mode 100644 index 0000000000..7531a1ef06 --- /dev/null +++ b/beam/tree.go @@ -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 +}