in cmd/hub/lifecycle/template.go [60:164]
func processTemplates(component *manifest.ComponentRef, templateSetup *manifest.TemplateSetup,
params parameters.LockedParameters, outputs parameters.CapturedOutputs,
dir string) []error {
componentName := manifest.ComponentQualifiedNameFromRef(component)
kv := parameters.ParametersKV(params)
templateSetup, err := expandParametersInTemplateSetup(templateSetup, kv)
if err != nil {
return []error{err}
}
err = checkTemplateSetupKind(templateSetup)
if err != nil {
return []error{err}
}
templates := scanTemplates(componentName, dir, templateSetup)
if config.Verbose {
if len(templates) > 0 {
log.Print("Component templates:")
printTemplates(templates)
} else if len(templateSetup.Files) > 0 || len(templateSetup.Directories) > 0 || len(templateSetup.Extra) > 0 {
log.Printf("No templates for component `%s`", componentName)
}
}
if len(templates) == 0 {
return nil
}
filenames := make([]string, 0, len(templates))
hasMustache := false
hasGo := false
for _, template := range templates {
filenames = append(filenames, template.Filename)
if !hasMustache && template.Kind == trueMustacheKind {
hasMustache = true
}
if !hasGo && template.Kind == goKind {
hasGo = true
}
}
cannot := checkStat(filenames)
if len(cannot) > 0 {
diag := make([]string, 0, len(cannot))
for _, e := range cannot {
diag = append(diag, fmt.Sprintf("\t`%s`: %v", e.Filename, e.Error))
}
return []error{fmt.Errorf("Unable to open `%s` component template input(s):\n%s", componentName, strings.Join(diag, "\n"))}
}
// during lifecycle operation `outputs` is nil - only parameters are available in templates
// outputs are for `hub render`
if outputs != nil {
var depends []string
if hasMustache || hasGo {
depends = component.Depends
}
kv = parameters.ParametersAndOutputsKVWithDepends(params, outputs, depends)
}
if config.Trace {
log.Printf("Template binding:\n%v", kv)
}
var mustacheKV map[string]interface{}
if hasMustache {
mustacheKV = mustacheCompatibleBindings(kv)
if config.Trace {
log.Printf("Mustache template binding:\n%v", mustacheKV)
}
}
var goKV map[string]interface{}
if hasGo {
goKV = goTemplateBindings(kv)
if config.Trace {
log.Printf("Go template binding:\n%v", goKV)
}
}
processor := func(content, filename, kind string) (string, []error) {
var outContent string
var err error
var errs []error
switch kind {
case "", curlyKind:
outContent, errs = processReplacement(content, filename, componentName, component.Depends, kv,
curlyReplacement, stripCurly)
case mustacheKind:
outContent, errs = processReplacement(content, filename, componentName, component.Depends, kv,
mustacheReplacement, stripMustache)
case trueMustacheKind:
outContent, err = processMustache(content, filename, componentName, mustacheKV)
case goKind:
outContent, err = processGo(content, filename, componentName, goKV)
}
if err != nil {
errs = append(errs, err)
}
return outContent, errs
}
errs := make([]error, 0)
for _, template := range templates {
errs = append(errs, processTemplate(template.Filename, template.Kind, componentName, processor)...)
}
return errs
}