feat templater: Add initial templating support
This commit is contained in:
parent
bb45bfa737
commit
9e3ee3f2bb
1 changed files with 97 additions and 0 deletions
97
templater/templater.go
Normal file
97
templater/templater.go
Normal file
|
@ -0,0 +1,97 @@
|
||||||
|
package templater
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"text/template"
|
||||||
|
"bytes"
|
||||||
|
|
||||||
|
"github.com/tazjin/kontemplate/context"
|
||||||
|
"github.com/polydawn/meep"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Error that is caused by non-existent template files being specified
|
||||||
|
type TemplateNotFoundError struct {
|
||||||
|
meep.AllTraits
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error that is caused during templating, e.g. required value being absent or invalid template format
|
||||||
|
type TemplatingError struct {
|
||||||
|
meep.AllTraits
|
||||||
|
}
|
||||||
|
|
||||||
|
func LoadAndPrepareTemplates(c *context.Context) ([]string, error) {
|
||||||
|
output := make([]string, 0)
|
||||||
|
|
||||||
|
for _, rs := range c.ResourceSets {
|
||||||
|
fmt.Fprintf(os.Stderr,"Loading resources for %s\n", rs.Name)
|
||||||
|
|
||||||
|
rp := path.Join(c.BaseDir, rs.Name)
|
||||||
|
files, err := ioutil.ReadDir(rp)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, meep.New(
|
||||||
|
&TemplateNotFoundError{Name: rs.Name},
|
||||||
|
meep.Cause(err),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for _, file := range files {
|
||||||
|
if !file.IsDir() && isResourceFile(file) {
|
||||||
|
p := path.Join(rp, file.Name())
|
||||||
|
o, err := templateFile(c, &rs, p)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
output = append(output, o)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func templateFile(c *context.Context, rs *context.ResourceSet, filename string) (string, error) {
|
||||||
|
tpl, err := template.ParseFiles(filename)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", meep.New(
|
||||||
|
&TemplateNotFoundError{Name: filename},
|
||||||
|
meep.Cause(err),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
var b bytes.Buffer
|
||||||
|
|
||||||
|
// Merge global and resourceset-specific values (don't override from global)
|
||||||
|
for k, v := range c.Global {
|
||||||
|
if _, ok := rs.Values[k]; !ok {
|
||||||
|
rs.Values[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
err = tpl.Execute(&b, rs.Values)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return "", meep.New(
|
||||||
|
&TemplatingError{},
|
||||||
|
meep.Cause(err),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return b.String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks whether a file is a resource file (i.e. is YAML or JSON)
|
||||||
|
func isResourceFile(f os.FileInfo) bool {
|
||||||
|
return strings.HasSuffix(f.Name(), "yaml") ||
|
||||||
|
strings.HasSuffix(f.Name(), "yml") ||
|
||||||
|
strings.HasSuffix(f.Name(), "json")
|
||||||
|
}
|
Loading…
Reference in a new issue