// +build ignore package main import ( "io/ioutil" "os" "path" "path/filepath" "strings" "text/template" ) const tpl = `// Code generated by go generate; DO NOT EDIT. package {{ .Package }} var {{ .Map }} = map[string]string{ {{ range $constant, $content := .Files }}` + "\t" + `"{{ $constant }}": ` + "`{{ $content }}`" + `, {{ end }}} ` var bundleTpl = template.Must(template.New("").Parse(tpl)) type Bundle struct { Package string Map string Files map[string]string } func (b *Bundle) Write(filename string) { f, err := os.Create(filename) if err != nil { panic(err) } defer f.Close() bundleTpl.Execute(f, b) } func NewBundle(pkg, mapName string) *Bundle { return &Bundle{ Package: pkg, Map: mapName, Files: make(map[string]string), } } func stripExtension(filename string) string { filename = strings.TrimSuffix(filename, path.Ext(filename)) return strings.Replace(filename, " ", "_", -1) } func readFile(filename string) []byte { data, err := ioutil.ReadFile(filename) if err != nil { panic(err) } return data } func glob(pattern string) []string { files, _ := filepath.Glob(pattern) for i := range files { if strings.Contains(files[i], "\\") { files[i] = filepath.ToSlash(files[i]) } } return files } func generateMap(target string, pkg string, mapName string, srcFiles []string) { bundle := NewBundle(pkg, mapName) for _, srcFile := range srcFiles { data := readFile(srcFile) filename := stripExtension(path.Base(srcFile)) bundle.Files[filename] = string(data) } bundle.Write(target) } func main() { generateMap(path.Join("storage", "sql.go"), "storage", "SqlMap", glob("storage/sql/*.sql")) generateMap(path.Join("web", "handler", "html.go"), "handler", "TplMap", glob("web/handler/html/*.html")) generateMap(path.Join("web", "handler", "common.go"), "handler", "TplCommonMap", glob("web/handler/html/common/*.html")) }