refactor templater: Add intermediate type to represent rendered RSes

As a first step in resolving #51 this refactors the `templater`
package to return rendered resource sets as a distinct type.

This also fixes #56
This commit is contained in:
Vincent Ambo 2017-06-11 21:25:56 +02:00
parent d76ea59f4c
commit f3264329b9

View file

@ -30,58 +30,79 @@ type TemplatingError struct {
meep.TraitCausable
}
func LoadAndPrepareTemplates(include *[]string, exclude *[]string, c *context.Context) (output []string, err error) {
type RenderedResource struct {
Filename string
Rendered string
}
type RenderedResourceSet struct {
Name string
Resources []RenderedResource
}
func LoadAndApplyTemplates(include *[]string, exclude *[]string, c *context.Context) ([]RenderedResourceSet, error) {
limitedResourceSets := applyLimits(&c.ResourceSets, include, exclude)
renderedResourceSets := make([]RenderedResourceSet, len(c.ResourceSets))
if len(*limitedResourceSets) == 0 {
fmt.Fprintln(os.Stderr, "No valid resource sets included!")
return
return renderedResourceSets, fmt.Errorf("No valid resource sets included!")
}
for _, rs := range *limitedResourceSets {
err = processResourceSet(c, &rs, &output)
set, err := processResourceSet(c, &rs)
if err != nil {
return
return nil, err
}
renderedResourceSets = append(renderedResourceSets, *set)
}
return
return renderedResourceSets, nil
}
func processResourceSet(c *context.Context, rs *context.ResourceSet, output *[]string) error {
func processResourceSet(c *context.Context, rs *context.ResourceSet) (*RenderedResourceSet, error) {
fmt.Fprintf(os.Stderr, "Loading resources for %s\n", rs.Name)
rp := path.Join(c.BaseDir, rs.Name)
files, err := ioutil.ReadDir(rp)
err = processFiles(c, rs, rp, files, output)
resources, err := processFiles(c, rs, rp, files)
if err != nil {
return meep.New(
return nil, meep.New(
&TemplateNotFoundError{Name: rs.Name},
meep.Cause(err),
)
}
return nil
return &RenderedResourceSet{
Name: rs.Name,
Resources: resources,
}, nil
}
func processFiles(c *context.Context, rs *context.ResourceSet, rp string, files []os.FileInfo, output *[]string) error {
func processFiles(c *context.Context, rs *context.ResourceSet, rp string, files []os.FileInfo) ([]RenderedResource, error) {
resources := make([]RenderedResource, len(c.ResourceSets))
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 err
return resources, err
}
*output = append(*output, o)
res := RenderedResource{
Filename: file.Name(),
Rendered: o,
}
resources = append(resources, res)
}
}
return nil
return resources, nil
}
func templateFile(c *context.Context, rs *context.ResourceSet, filename string) (string, error) {