// Grabs a folder and generates a go file with a map package main import ( "fmt" "io/ioutil" "log" "os" "path/filepath" ) func main() { if len(os.Args) != 3 { fmt.Println("This will create a folder named by and add the generated file") fmt.Println("usage: ", os.Args[0], " ") return } var folder = os.Args[1] var pkg = filepath.Base(os.Args[2]) // Remove trailing '/' var dst = os.Args[2] var data = map[string]string{} filepath.Walk(folder, func(fpath string, f os.FileInfo, err error) error { if f.IsDir() { return nil // Continue } // Get ABSPATH absFolder, err := filepath.Abs(folder) if err != nil { return err } absPath, err := filepath.Abs(fpath) if err != nil { return err } kfname := absPath[len(absFolder):] log.Printf("Processing: %s ", kfname) fdata, err := ioutil.ReadFile(fpath) if err != nil { log.Fatal(err) return err } vardata := "" for _, v := range fdata { vardata += fmt.Sprintf("\\x%02X", v) } data[kfname] = vardata return nil }) // Write golang file os.Mkdir(dst, os.FileMode(0755)) f, err := os.OpenFile(fmt.Sprintf("%s/%s.go", dst, pkg), os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.FileMode(0644)) if err != nil { log.Fatal(err) } defer f.Close() f.WriteString("// Generated by folder2go\n") f.WriteString(fmt.Sprintf("package %s\n\n", pkg)) // If we want http support // Templates would be nice here f.WriteString(` import ( "mime" "net/http" "path/filepath" ) `) f.WriteString("//Data exported data taken from folder\n") f.WriteString("var Data = map[string][]byte {\n") for k, v := range data { f.WriteString(fmt.Sprintf("\t\"%s\":\t\t[]byte(\"%s\"),\n", k, v)) } f.WriteString("}\n") // Should be optional f.WriteString(` func AssetHandleFunc(w http.ResponseWriter, r *http.Request) { var solvedPath =r.URL.Path if solvedPath == "/" { solvedPath = "/index.html" } data, ok := Data[solvedPath] if !ok { w.WriteHeader(404) } w.Header().Set("Content-type",mime.TypeByExtension(filepath.Ext(solvedPath))) w.Write(data) }`) }