Skip to content

Instantly share code, notes, and snippets.

@Oppodelldog
Created June 20, 2021 09:25
Show Gist options
  • Save Oppodelldog/6e36c372b77f8f73c0feafaaf21b0499 to your computer and use it in GitHub Desktop.
Save Oppodelldog/6e36c372b77f8f73c0feafaaf21b0499 to your computer and use it in GitHub Desktop.
get fields from go template
package page
import (
"html/template"
"sort"
"text/template/parse"
)
func GetTemplateFields(tpl *template.Template) []string {
return walker{fields: map[string]struct{}{}}.tree(tpl)
}
type walker struct {
fields map[string]struct{}
}
func (c walker) tree(tpl *template.Template) []string {
for _, node := range tpl.Tree.Root.Nodes {
c.node(node)
}
var fields []string
for field := range c.fields {
fields = append(fields, field)
}
sort.Strings(fields)
return fields
}
func (c *walker) node(node parse.Node) {
switch v := node.(type) {
case *parse.ActionNode:
c.node(v.Pipe)
case *parse.BoolNode:
case *parse.BranchNode:
c.node(v.Pipe)
c.node(v.List)
c.node(v.ElseList)
case *parse.ChainNode:
c.node(v.Node)
case *parse.CommandNode:
for _, n := range v.Args {
c.node(n)
}
case *parse.CommentNode:
case *parse.DotNode:
case *parse.FieldNode:
c.fields[v.String()] = struct{}{}
case *parse.IdentifierNode:
case *parse.IfNode:
c.node(v.List)
c.node(v.Pipe)
c.node(v.ElseList)
case *parse.ListNode:
if v == nil {
break
}
for _, n := range v.Nodes {
c.node(n)
}
case *parse.NilNode:
case *parse.NumberNode:
case *parse.PipeNode:
for _, cmd := range v.Cmds {
c.node(cmd)
}
for _, variableNode := range v.Decl {
c.node(variableNode)
}
case *parse.RangeNode:
c.node(v.List)
c.node(v.Pipe)
c.node(v.ElseList)
case *parse.StringNode:
case *parse.TemplateNode:
c.node(v.Pipe)
case *parse.TextNode:
case *parse.VariableNode:
case *parse.WithNode:
c.node(v.List)
c.node(v.ElseList)
c.node(v.Pipe)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment