func()

in pkg/options/gotmpl/go_template_applier.go [102:161]


func (m *applier) applyOptions(obj *unstructured.Unstructured, ref bundle.ComponentReference, opts options.JSONOptions) ([]*unstructured.Unstructured, error) {
	objTmpl := &bundle.ObjectTemplate{}
	err := converter.FromUnstructured(obj).ToObject(objTmpl)
	if err != nil {
		return nil, err
	}

	if objTmpl.OptionsSchema != nil {
		opts, err = openapi.ApplyDefaults(opts, objTmpl.OptionsSchema)
		if err != nil {
			return nil, fmt.Errorf("applying schema defaults for object template named %q: %v", obj.GetName(), err)
		}
	}

	tmplFuncs := make(map[string]interface{})

	useSafeYAMLTemplater := m.useSafeYAMLTemplater
	if internal.HasSafeYAMLAnnotation(objTmpl.ObjectMeta) {
		useSafeYAMLTemplater = true
	}
	tmpl, err := internal.NewTemplater(ref.ComponentName+"-"+obj.GetName(), objTmpl.Template, tmplFuncs, useSafeYAMLTemplater)
	if err != nil {
		return nil, fmt.Errorf("error parsing template for object %q: %v", obj.GetName(), err)
	}

	for _, goTmplOpt := range m.goTmplOptions {
		tmpl.Option(goTmplOpt)
	}

	var buf bytes.Buffer
	err = tmpl.Execute(&buf, opts)
	if err != nil {
		return nil, fmt.Errorf("error executing template for object %v: %v", obj.GetName(), err)
	}

	// performed by go-yaml: https://godoc.org/gopkg.in/yaml.v2
	var out []*unstructured.Unstructured
	yamlStr := buf.String()
	if multiDoc.MatchString(yamlStr) {
		docs := multiDoc.Split(string(yamlStr), -1)
		for _, doc := range docs {
			if onlyWhitespace.MatchString(doc) {
				continue
			}
			uns, err := converter.FromYAMLString(doc).ToUnstructured()
			if err != nil {
				return nil, err
			}
			out = append(out, uns)
		}
	} else {
		uns, err := converter.FromYAMLString(yamlStr).ToUnstructured()
		if err != nil {
			return nil, err
		}
		out = append(out, uns)
	}

	return out, err
}