|  | @@ -0,0 +1,116 @@
 | 
	
		
			
				|  |  | +package main
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +import (
 | 
	
		
			
				|  |  | +	"bytes"
 | 
	
		
			
				|  |  | +	"encoding/json"
 | 
	
		
			
				|  |  | +	"fmt"
 | 
	
		
			
				|  |  | +	"html"
 | 
	
		
			
				|  |  | +	"html/template"
 | 
	
		
			
				|  |  | +	"io/ioutil"
 | 
	
		
			
				|  |  | +	"os"
 | 
	
		
			
				|  |  | +	"strings"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	"gopkg.in/yaml.v2"
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	"code.senomas.com/go/util"
 | 
	
		
			
				|  |  | +)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// Variables struct
 | 
	
		
			
				|  |  | +type Variables struct {
 | 
	
		
			
				|  |  | +	Env map[string]string
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +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 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 bool, vt, vf interface{}) interface{} {
 | 
	
		
			
				|  |  | +	if test {
 | 
	
		
			
				|  |  | +		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() {
 | 
	
		
			
				|  |  | +	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
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	text, err = ioutil.ReadFile(os.Args[1])
 | 
	
		
			
				|  |  | +	util.Check("Error open file %s %v", os.Args[1], 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, &Variables{env})
 | 
	
		
			
				|  |  | +	util.Check("Execute error %v", err)
 | 
	
		
			
				|  |  | +	fmt.Println(html.UnescapeString(bb.String()))
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 |