87 lines
2.1 KiB
Go
87 lines
2.1 KiB
Go
|
package templating
|
||
|
|
||
|
import (
|
||
|
"sort"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// DefaultSeparator is the default separation character to use when separating template parts.
|
||
|
DefaultSeparator = "."
|
||
|
)
|
||
|
|
||
|
// Engine uses a Matcher to retrieve the appropriate template and applies the template
|
||
|
// to the input string
|
||
|
type Engine struct {
|
||
|
joiner string
|
||
|
matcher *matcher
|
||
|
}
|
||
|
|
||
|
// Apply extracts the template fields from the given line and returns the measurement
|
||
|
// name, tags and field name
|
||
|
func (e *Engine) Apply(line string) (string, map[string]string, string, error) {
|
||
|
return e.matcher.match(line).Apply(line, e.joiner)
|
||
|
}
|
||
|
|
||
|
// NewEngine creates a new templating engine
|
||
|
func NewEngine(joiner string, defaultTemplate *Template, templates []string) (*Engine, error) {
|
||
|
engine := Engine{
|
||
|
joiner: joiner,
|
||
|
matcher: newMatcher(defaultTemplate),
|
||
|
}
|
||
|
templateSpecs := parseTemplateSpecs(templates)
|
||
|
|
||
|
for _, templateSpec := range templateSpecs {
|
||
|
if err := engine.matcher.addSpec(templateSpec); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return &engine, nil
|
||
|
}
|
||
|
|
||
|
func parseTemplateSpecs(templates []string) templateSpecs {
|
||
|
tmplts := templateSpecs{}
|
||
|
for _, pattern := range templates {
|
||
|
tmplt := templateSpec{
|
||
|
separator: DefaultSeparator,
|
||
|
}
|
||
|
|
||
|
// Format is [separator] [filter] <template> [tag1=value1,tag2=value2]
|
||
|
parts := strings.Fields(pattern)
|
||
|
partsLength := len(parts)
|
||
|
if partsLength < 1 {
|
||
|
// ignore
|
||
|
continue
|
||
|
}
|
||
|
if partsLength == 1 {
|
||
|
tmplt.template = pattern
|
||
|
} else if partsLength == 4 {
|
||
|
tmplt.separator = parts[0]
|
||
|
tmplt.filter = parts[1]
|
||
|
tmplt.template = parts[2]
|
||
|
tmplt.tagstring = parts[3]
|
||
|
} else {
|
||
|
hasTagstring := strings.Contains(parts[partsLength-1], "=")
|
||
|
if hasTagstring {
|
||
|
tmplt.tagstring = parts[partsLength-1]
|
||
|
tmplt.template = parts[partsLength-2]
|
||
|
if partsLength == 3 {
|
||
|
tmplt.filter = parts[0]
|
||
|
}
|
||
|
} else {
|
||
|
tmplt.template = parts[partsLength-1]
|
||
|
if partsLength == 2 {
|
||
|
tmplt.filter = parts[0]
|
||
|
} else { // length == 3
|
||
|
tmplt.separator = parts[0]
|
||
|
tmplt.filter = parts[1]
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
tmplts = append(tmplts, tmplt)
|
||
|
}
|
||
|
sort.Sort(tmplts)
|
||
|
return tmplts
|
||
|
}
|