From c63b1c74dd382999cc1b9d08f0a6ac9a74dc2b49 Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Fri, 25 Sep 2026 08:08:43 +0200 Subject: [PATCH] Make walkEvery the zero mode, and have drawPath's panic name the head its tail descends from --- hold.go | 2 +- path.go | 14 +++++++------- render.go | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/hold.go b/hold.go index 2b579d4..7d7ccd7 100644 --- a/hold.go +++ b/hold.go @@ -37,7 +37,7 @@ func readField(s *session, t *template, held *hold, sc renderScope, a arm) draw if r, done := d.value[a.path]; done { return r } - r := renderLeaf(s, drawPath(t.head(a.key), a.tail, &d.pins, &pathDraws{s: s, held: d, a: &a}), sc) + r := renderLeaf(s, drawPath(t.head(a.key), a.tail, a.key, &d.pins, &pathDraws{s: s, held: d, a: &a}), sc) if d.value == nil { d.value = map[string]draw{} } diff --git a/path.go b/path.go index ec82450..73da47e 100644 --- a/path.go +++ b/path.go @@ -130,11 +130,11 @@ func names(segs []string) []string { type walkMode uint8 const ( - // walkCover stops at a choice, handing it whole to leaf, and reads no row. - walkCover walkMode = iota // walkEvery proves every variant carries the rest of the path and walks each, // pinning the rows it selects in pins. - walkEvery + walkEvery walkMode = iota + // walkCover stops at a choice, handing it whole to leaf, and reads no row. + walkCover // walkProbe proves as walkEvery does, walking one variant, so a path that // resolves resolves whichever variants and rows are drawn. walkProbe @@ -144,8 +144,7 @@ const ( ) // pathWalk is one walk of a dotted path: level runs at each template a segment -// descends into, leaf where the walk ends, and a nil action is skipped. A render's -// walk sets only pins and draws, so it allocates nothing. +// descends into, leaf where the walk ends, and a nil action is skipped. type pathWalk struct { mode walkMode level func(t *template, rest []string) error @@ -211,10 +210,11 @@ func (w pathWalk) atLeaf(n node) error { // drawPath draws the rows and variants a path reads, pinning them in pins. The path // must be proved first, by a probe or by New's fences, so the walk cannot fail. -func drawPath(n node, tail []string, pins *pinSet, draws *pathDraws) node { +// head is what n is reached by, for the panic. +func drawPath(n node, tail []string, head string, pins *pinSet, draws *pathDraws) node { leaf, err := walkPath(n, tail, pathWalk{mode: walkDraw, pins: pins, draws: draws}) if err != nil { - panic(fmt.Sprintf("fejkdata: %s: %v; the path should have been proved before it was drawn", joinSegments(tail), err)) + panic(fmt.Sprintf("fejkdata: %s: %v; the path should have been proved before it was drawn", join(head, joinSegments(tail)), err)) } return leaf } diff --git a/render.go b/render.go index ef02a75..be0194d 100644 --- a/render.go +++ b/render.go @@ -48,7 +48,7 @@ func descend(s *session, root node, segments []string, sc renderScope) (node, er if _, err := walkPath(root, segments, pathWalk{mode: walkProbe, pins: &probe}); err != nil { return nil, err } - return drawPath(root, segments, &sc.hold().pins, &pathDraws{s: s}), nil + return drawPath(root, segments, "", &sc.hold().pins, &pathDraws{s: s}), nil } // render evaluates a compiled node to a string. compile validates every node up