106 lines
2.1 KiB
Go
106 lines
2.1 KiB
Go
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
|
|
}
|