From 2d8fcae4f48ef02ad10fd924701d452a7fe7f30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikael=20G=C3=B6ransson?= Date: Fri, 28 Aug 2026 00:08:58 +0200 Subject: [PATCH] Reject a folder using the reference prefix, and filter bindings only where they exist --- data.go | 3 +++ reference.go | 13 +++++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/data.go b/data.go index a41bd92..6d246c5 100644 --- a/data.go +++ b/data.go @@ -55,6 +55,9 @@ func loadDir(dir string) (*group, error) { for _, e := range entries { full := filepath.Join(dir, e.Name()) if e.IsDir() { + if isRef(e.Name()) { + return nil, fmt.Errorf("%s: folder %q starts with %q, which is reserved for {..path} bindings", full, e.Name(), refPrefix) + } child, err := loadDir(full) if err != nil { return nil, err diff --git a/reference.go b/reference.go index 89c8b7b..0cdb4bc 100644 --- a/reference.go +++ b/reference.go @@ -75,7 +75,7 @@ type namedNode struct { func contained(n node) []namedNode { switch n := n.(type) { case *group: - return named(n.children) + return authored(n.children) case *choice: out := make([]namedNode, len(n.items)) for i, it := range n.items { @@ -90,7 +90,8 @@ func contained(n node) []namedNode { } // named skips a bound {..path} key: it is a render edge, not containment, so using -// it as a path segment would report a node under a path that does not reach it. +// it as a path segment would report a node under a path that does not reach it. Only +// a template's fields hold bindings, so group children go through authored. func named(m map[string]node) []namedNode { out := make([]namedNode, 0, len(m)) for _, name := range sortedNames(m) { @@ -102,6 +103,14 @@ func named(m map[string]node) []namedNode { return out } +func authored(m map[string]node) []namedNode { + out := make([]namedNode, 0, len(m)) + for _, name := range sortedNames(m) { + out = append(out, namedNode{name: name, node: m[name]}) + } + return out +} + func sortedNames(m map[string]node) []string { names := make([]string, 0, len(m)) for name := range m {