package templates import ( "bytes" "encoding/json" "strings" "text/template" "github.com/BurntSushi/toml" "github.com/Masterminds/sprig/v3" "gopkg.in/yaml.v2" ) func funcMap() template.FuncMap { f := sprig.TxtFuncMap() delete(f, "env") delete(f, "expandenv") extra := template.FuncMap{ "toToml": toTOML, "toYaml": toYAML, "fromYaml": fromYAML, "fromYamlArray": fromYAMLArray, "toJson": toJSON, "fromJson": fromJSON, "fromJsonArray": fromJSONArray, "include": func(string, interface{}) string { return "not implemented" }, "tpl": func(string, interface{}) interface{} { return "not implemented" }, "required": func(string, interface{}) (interface{}, error) { return "not implemented", nil }, "lookup": func(string, string, string, string) (map[string]interface{}, error) { return map[string]interface{}{}, nil }, } for k, v := range extra { f[k] = v } return f } func toYAML(v interface{}) string { data, err := yaml.Marshal(v) if err != nil { // Swallow errors inside of a template. return "" } return strings.TrimSuffix(string(data), "\n") } func fromYAML(str string) map[string]interface{} { m := map[string]interface{}{} if err := yaml.Unmarshal([]byte(str), &m); err != nil { m["Error"] = err.Error() } return m } func fromYAMLArray(str string) []interface{} { a := []interface{}{} if err := yaml.Unmarshal([]byte(str), &a); err != nil { a = []interface{}{err.Error()} } return a } func toTOML(v interface{}) string { b := bytes.NewBuffer(nil) e := toml.NewEncoder(b) err := e.Encode(v) if err != nil { return err.Error() } return b.String() } func toJSON(v interface{}) string { data, err := json.Marshal(v) if err != nil { // Swallow errors inside of a template. return "" } return string(data) } func fromJSON(str string) map[string]interface{} { m := make(map[string]interface{}) if err := json.Unmarshal([]byte(str), &m); err != nil { m["Error"] = err.Error() } return m } func fromJSONArray(str string) []interface{} { a := []interface{}{} if err := json.Unmarshal([]byte(str), &a); err != nil { a = []interface{}{err.Error()} } return a }