58 lines
1.8 KiB
Go
58 lines
1.8 KiB
Go
package fejkdata
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// drawSet is one render's reference draws: the unnamed draw group's, and each named one's.
|
|
type drawSet struct {
|
|
unnamed draws
|
|
named map[string]*draws
|
|
}
|
|
|
|
// drawScope is where a render reads its reference paths: a draw set, in the draw group of the
|
|
// template rendering, and the row a table's format is rendering, which its columns read.
|
|
type drawScope struct {
|
|
set *drawSet
|
|
group string
|
|
t *table
|
|
row int
|
|
}
|
|
|
|
// newDrawSet makes the unnamed group's maps where the set is declared, keeping them on that frame's
|
|
// stack for a render that reads through them; a zero drawSet makes them on its first read instead.
|
|
func newDrawSet(s *session) drawSet {
|
|
return drawSet{unnamed: draws{variant: map[string]node{}, value: map[string]draw{}, s: s}}
|
|
}
|
|
|
|
// renderOnce renders n as one render, over draws of its own.
|
|
func renderOnce(s *session, n node) string {
|
|
set := drawSet{unnamed: draws{s: s}}
|
|
return render(s, n, drawScope{set: &set})
|
|
}
|
|
|
|
// in is the scope t renders in: its draw group where it names one, else its caller's.
|
|
func (sc drawScope) in(t *template) drawScope {
|
|
if t.drawGroupKey != "" {
|
|
sc.group = t.drawGroupKey
|
|
}
|
|
return sc
|
|
}
|
|
|
|
// draws is the set's draws for sc's draw group. The session is passed in rather than
|
|
// read out of the set: copying it from there would leak the set's maps to the heap.
|
|
func (sc drawScope) draws(s *session) *draws {
|
|
if sc.group == "" {
|
|
return &sc.set.unnamed
|
|
}
|
|
d, drew := sc.set.named[sc.group]
|
|
if !drew {
|
|
if sc.set.named == nil {
|
|
sc.set.named = map[string]*draws{}
|
|
}
|
|
d = &draws{variant: map[string]node{}, value: map[string]draw{}, s: s}
|
|
sc.set.named[strings.Clone(sc.group)] = d // a key from sc would leak sc, and with it every render's draw set, to the heap
|
|
}
|
|
return d
|
|
}
|