123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- 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{} {
- for _, v := range vs {
- if vv, ok := v.(string); ok {
- if len(vv) > 0 {
- return vv
- }
- } else if v != nil {
- 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 <template file>")
- }
- text, err = ioutil.ReadFile(os.Args[1])
- util.Check("Error %v", err)
- tmpl, err := template.New("config").Option("missingkey=zero").Funcs(funcMap).Parse(string(text))
- util.Check("Error %v", err)
- env := make(map[string]string)
- for _, v := range os.Environ() {
- splits := strings.Split(v, "=")
- env[splits[0]] = strings.Join(splits[1:], "=")
- }
- var bb bytes.Buffer
- err = tmpl.Execute(&bb, env)
- util.Check("Execute error %v", err)
- fmt.Println(html.UnescapeString(bb.String()))
- }
|