aboutsummaryrefslogtreecommitdiff
path: root/plugin/file/tree/walk.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/file/tree/walk.go')
-rw-r--r--plugin/file/tree/walk.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/plugin/file/tree/walk.go b/plugin/file/tree/walk.go
new file mode 100644
index 000000000..00accbafa
--- /dev/null
+++ b/plugin/file/tree/walk.go
@@ -0,0 +1,30 @@
+package tree
+
+import "github.com/miekg/dns"
+
+// Walk performs fn on all values stored in the tree. If a non-nil error is returned the
+// Walk was interrupted by an fn returning that error. If fn alters stored values' sort
+// relationships, future tree operation behaviors are undefined.
+func (t *Tree) Walk(fn func(e *Elem, rrs map[uint16][]dns.RR) error) error {
+ if t.Root == nil {
+ return nil
+ }
+ return t.Root.walk(fn)
+}
+
+func (n *Node) walk(fn func(e *Elem, rrs map[uint16][]dns.RR) error) error {
+ if n.Left != nil {
+ if err := n.Left.walk(fn); err != nil {
+ return err
+ }
+ }
+ if err := fn(n.Elem, n.Elem.m); err != nil {
+ return err
+ }
+ if n.Right != nil {
+ if err := n.Right.walk(fn); err != nil {
+ return err
+ }
+ }
+ return nil
+}