From 44601c90ab53566fe7d7cf92be5b7bfc71e29753 Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Thu, 3 Sep 2026 21:12:04 +0200 Subject: [PATCH] Offer the reference hint only where it would render the same value, and name the guard set in the help --- builtins.go | 2 +- cmd/fejkdata/main.go | 3 ++- template.go | 8 +++++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/builtins.go b/builtins.go index d72ce2e..8b9fec6 100644 --- a/builtins.go +++ b/builtins.go @@ -133,7 +133,7 @@ func transformArg(fields map[string]node, a []string) error { _, _, err := refShape(leaf) return err } - return checkArm(leaf, fields) + return checkArm(leaf, fields, false) } func transformOperand(a []string) []string { diff --git a/cmd/fejkdata/main.go b/cmd/fejkdata/main.go index d25d7a7..bf69ed0 100644 --- a/cmd/fejkdata/main.go +++ b/cmd/fejkdata/main.go @@ -31,7 +31,8 @@ An argument containing a { token, or a JSON object, array or string, is a template; any other argument is a path (a path never contains a brace, a bracket or a quote). Templates reach the data by reference from the root — {/sv_SE.person.last} — whether the data is shipped or layered with --data-path. An -argument carrying one of those characters but no valid JSON names neither. +argument carrying a bracket, a closing brace or a quote but no valid JSON names +neither. -d, --data-path D a data directory to layer over the shipped data (repeatable; last wins on a clash) -h, --help print this help, then exit diff --git a/template.go b/template.go index 0f6e764..7ef9336 100644 --- a/template.go +++ b/template.go @@ -140,7 +140,7 @@ func checkTokens(format string, fields map[string]node) error { } continue // its target is checked at New (see linkRefs) } - if err := checkArm(name, fields); err != nil { + if err := checkArm(name, fields, len(names) == 1); err != nil { return fmt.Errorf("token {%s}: %w", t.body, err) } } @@ -151,7 +151,9 @@ func checkTokens(format string, fields map[string]node) error { } // checkArm validates one sibling name or path against a template's fields. -func checkArm(name string, fields map[string]node) error { +// wholeToken says the name is the token's entire body, so {/name} would render +// the same value and can be offered as the reference spelling. +func checkArm(name string, fields map[string]node, wholeToken bool) error { a := splitArm(name, nil) if err := checkSegments(a); err != nil { return err @@ -166,7 +168,7 @@ func checkArm(name string, fields map[string]node) error { } if len(fields) == 0 { hint := "" - if hintableRef(name) { + if wholeToken && hintableRef(name) { hint = fmt.Sprintf(" — write {/%s} to reference the data", name) } return fmt.Errorf("no field %q; a token names a sibling field, and this template has none%s", a.key, hint)