package main import ( "encoding/json" "io/ioutil" "os" "strings" "text/template" "unicode" ) type TemplateData struct { CollectorName string Class string Members []Member } type Member struct { Name string Type string } func main() { bytes, err := ioutil.ReadAll(os.Stdin) if err != nil { panic(err) } var data TemplateData if err := json.Unmarshal(bytes, &data); err != nil { panic(err) } funcs := template.FuncMap{ "toLower": strings.ToLower, "toSnakeCase": toSnakeCase, } template, err := template.New("template").Funcs(funcs).ParseFiles("collector.template") if err != nil { panic(err) } err = template.ExecuteTemplate(os.Stdout, "collector.template", data) if err != nil { panic(err) } } // https://gist.github.com/elwinar/14e1e897fdbe4d3432e1 func toSnakeCase(in string) string { runes := []rune(in) length := len(runes) var out []rune for i := 0; i < length; i++ { if i > 0 && unicode.IsUpper(runes[i]) && ((i+1 < length && unicode.IsLower(runes[i+1])) || unicode.IsLower(runes[i-1])) { out = append(out, '_') } out = append(out, unicode.ToLower(runes[i])) } return string(out) }