package main import ( "bytes" "encoding/json" "fmt" "html" "html/template" "io/ioutil" "os" "strings" "gopkg.in/yaml.v2" "code.senomas.com/go/util" ) func parseYAML(text string) map[string]interface{} { val := make(map[string]interface{}) err := yaml.Unmarshal([]byte(text), &val) util.Check("Invalid yaml [%s] %v", text, err) return val } func parseJSON(text string) map[string]interface{} { val := make(map[string]interface{}) err := json.Unmarshal([]byte(text), &val) util.Check("Invalid json [%s] %v", text, err) return val } func value(vs ...interface{}) interface{} { fmt.Printf("TEST VALUES [%v]\n", vs) for _, v := range vs { if vv, ok := v.(string); ok { fmt.Printf("TEST VALUE STRING [%s]\n", vv) if len(vv) > 0 { return vv } } else if v != nil { fmt.Printf("TEST VALUE ELSE [%v]\n", vv) return v } } return nil } func cat(spacer string, va ...interface{}) string { var bb bytes.Buffer for k, v := range va { if k > 0 { bb.WriteString(spacer) } fmt.Fprintf(&bb, "%v", v) } return bb.String() } func split(v string, sep string) []string { return strings.Split(v, sep) } func ift(test interface{}, vt, vf interface{}) interface{} { var tb bool if tv, ok := test.(bool); ok { tb = tv } else if tv, ok := test.(string); ok { tb = len(tv) > 0 } else if tv, ok := test.(int); ok { tb = tv != 0 } else { tb = test != nil } if tb { return vt } return vf } func get(v map[string]interface{}, key string) interface{} { return v[key] } func getMap(v map[string]interface{}, keys ...string) interface{} { var ok bool for _, kk := range keys { v, ok = v[kk].(map[string]interface{}) if !ok { return nil } } return v } func main() { defer func() { if r := recover(); r != nil { fmt.Println(r) } }() funcMap := template.FuncMap{ "parseYAML": parseYAML, "parseJSON": parseJSON, "value": value, "cat": cat, "ift": ift, "split": split, "get": get, "getMap": getMap, } var text []byte var err error if len(os.Args) != 2 { panic("Usage: gotmpl