package web
import (
"errors"
"html/template"
"text/template/parse"
"tug/internal/transport/web/text"
)
func walkPipes(n parse.Node, f func(*parse.PipeNode)) {
switch n := n.(type) {
case *parse.ListNode:
if n == nil {
return
}
for _, c := range n.Nodes {
walkPipes(c, f)
}
case *parse.ActionNode:
f(n.Pipe)
case *parse.IfNode:
f(n.Pipe)
walkPipes(n.List, f)
walkPipes(n.ElseList, f)
case *parse.RangeNode:
f(n.Pipe)
walkPipes(n.List, f)
walkPipes(n.ElseList, f)
case *parse.WithNode:
f(n.Pipe)
walkPipes(n.List, f)
walkPipes(n.ElseList, f)
case *parse.TemplateNode:
f(n.Pipe)
}
}
func templateKeys(tpl *template.Template) []text.Key {
var keys []text.Key
for _, tt := range tpl.Templates() {
if tt.Tree == nil {
continue
}
walkPipes(tt.Tree.Root, func(p *parse.PipeNode) {
if p == nil {
return
}
for _, c := range p.Cmds {
if len(c.Args) < 2 {
continue
}
id, ok := c.Args[0].(*parse.IdentifierNode)
if !ok || (id.Ident != "t" && id.Ident != "tr" && id.Ident != "trt") {
continue
}
if s, ok := c.Args[1].(*parse.StringNode); ok {
keys = append(keys, text.Key(s.Text))
}
}
})
}
return keys
}
func checkKeys(tpl *template.Template) error {
for _, k := range templateKeys(tpl) {
if _, err := lookup(k); err != nil {
return err
}
}
return nil
}
var errNoPage = errors.New("no such page template")