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")