func (tmpl *Template) Tags() []Tag {
	return extractTags(tmpl.elems)
}
Tags returns the mustache tags for the given template
package mustache
import (
	"bytes"
	"fmt"
	"html/template"
	"io"
	"io/ioutil"
	"os"
	"path"
	"reflect"
	"strconv"
	"strings"
)
var (
	AllowMissingVariables = true
)
type TagType uint
const (
	Invalid TagType = iota
	Variable
	Section
	InvertedSection
	Partial
)
func (t TagType) String() string {
	if int(t) < len(tagNames) {
		return tagNames[t]
	}
	return "type" + strconv.Itoa(int(t))
}
var tagNames = []string{
	Invalid:         "Invalid",
	Variable:        "Variable",
	Section:         "Section",
	InvertedSection: "InvertedSection",
	Partial:         "Partial",
}
type Tag interface {
	Type() TagType
	Name() string
	Tags() []Tag
}
type textElement struct {
	text []byte
}
type varElement struct {
	name string
	raw  bool
}
type sectionElement struct {
	name      string
	inverted  bool
	startline int
	elems     []interface{}
}
type partialElement struct {
	name string
	prov PartialProvider
}
type Template struct {
	data    string
	otag    string
	ctag    string
	p       int
	curline int
	dir     string
	elems   []interface{}
	partial PartialProvider
}
type parseError struct {
	line    int
	message string
}