|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"flag"
|
|
|
|
"os"
|
|
|
|
"strings"
|
|
|
|
"text/template"
|
|
|
|
"bufio"
|
|
|
|
"io"
|
|
|
|
)
|
|
|
|
|
|
|
|
const defaultParamPrefix = "GEV"
|
|
|
|
const envDelimiter = "="
|
|
|
|
const paramsListDelimiter = ","
|
|
|
|
const paramsListSuffix = "LIST"
|
|
|
|
const templateSuffix = ".tpl"
|
|
|
|
|
|
|
|
func getArgs() (string, string, string) {
|
|
|
|
inFileName := flag.String("i", "", "Input file name")
|
|
|
|
outFileName := flag.String("o", "", "Output file name")
|
|
|
|
prefix := flag.String("p", defaultParamPrefix, "Prefix for environment variables")
|
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
if *outFileName == "" && strings.HasSuffix(*inFileName, templateSuffix) {
|
|
|
|
*outFileName = strings.TrimSuffix(*inFileName, templateSuffix)
|
|
|
|
}
|
|
|
|
|
|
|
|
return *inFileName, *outFileName, *prefix
|
|
|
|
}
|
|
|
|
|
|
|
|
func getParams(prefix string, suffix string, delimiter string) map[string]interface{} {
|
|
|
|
prefixShift := len(prefix) + 1
|
|
|
|
suffixLen := len(suffix)
|
|
|
|
tplParams := make(map[string]interface{})
|
|
|
|
|
|
|
|
for _, e := range os.Environ() {
|
|
|
|
pair := strings.Split(e, envDelimiter)
|
|
|
|
if strings.HasPrefix(pair[0], prefix) {
|
|
|
|
var (
|
|
|
|
paramName string
|
|
|
|
paramValue string
|
|
|
|
paramList []string
|
|
|
|
)
|
|
|
|
if strings.HasSuffix(pair[0], suffix) {
|
|
|
|
suffixShift := len(pair[0]) - suffixLen - 1
|
|
|
|
paramName = pair[0][prefixShift:suffixShift]
|
|
|
|
trimmer := strings.Join([]string{delimiter, " "}, "")
|
|
|
|
paramList = strings.Split(strings.Trim(pair[1], trimmer), delimiter)
|
|
|
|
tplParams[paramName] = paramList
|
|
|
|
} else {
|
|
|
|
paramName = pair[0][prefixShift:]
|
|
|
|
paramValue = pair[1]
|
|
|
|
tplParams[paramName] = paramValue
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return tplParams
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
var (
|
|
|
|
inFileName string
|
|
|
|
outFileName string
|
|
|
|
prefix string
|
|
|
|
out *os.File
|
|
|
|
tmpl *template.Template
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
inFileName, outFileName, prefix = getArgs()
|
|
|
|
|
|
|
|
if inFileName != "" {
|
|
|
|
tmpl, err = template.ParseFiles(inFileName)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
var (
|
|
|
|
content []rune
|
|
|
|
b rune
|
|
|
|
)
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
for {
|
|
|
|
b, _, err = reader.ReadRune()
|
|
|
|
if err != nil && err == io.EOF {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
content = append(content, b)
|
|
|
|
}
|
|
|
|
tmpl, _ = template.New("piped").Parse(string(content))
|
|
|
|
}
|
|
|
|
|
|
|
|
if outFileName != "" {
|
|
|
|
out, err = os.Create(outFileName)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
out = os.Stdout
|
|
|
|
}
|
|
|
|
|
|
|
|
tplParams := getParams(prefix, paramsListSuffix, paramsListDelimiter)
|
|
|
|
|
|
|
|
tmpl.Execute(out, tplParams)
|
|
|
|
}
|