github.com/gocaveman/caveman@v0.0.0-20191211162744-0ddf99dbdf6e/gen/embed-tmpl.go (about) 1 package gen 2 3 import ( 4 "fmt" 5 "path" 6 "path/filepath" 7 "strings" 8 9 "github.com/spf13/pflag" 10 ) 11 12 func init() { 13 globalMapGenerator["embed-tmpl"] = GeneratorFunc(func(s *Settings, name string, args ...string) error { 14 15 fset := pflag.NewFlagSet("gen", pflag.ContinueOnError) 16 targetFile, data, err := ParsePFlagsAndOneFile(s, fset, args) 17 if err != nil { 18 return err 19 } 20 21 targetDir, targetFileName := filepath.Split(targetFile) 22 if path.Ext(targetFileName) != ".go" { 23 return fmt.Errorf("target file name (%q) must end with .go", targetFileName) 24 } 25 _ = targetDir 26 27 targetGogenFileName := strings.Replace(targetFileName, ".go", "-gogen.go", 1) 28 data["TargetGogenFileName"] = targetGogenFileName 29 targetGogenFile := filepath.Join(targetDir, targetGogenFileName) 30 31 targetDataFileName := strings.Replace(targetFileName, ".go", "-data.go", 1) 32 data["TargetDataFileName"] = targetDataFileName 33 targetDataDevFileName := strings.Replace(targetFileName, ".go", "-data-dev.go", 1) 34 data["TargetDataDevFileName"] = targetDataDevFileName 35 36 err = OutputGoSrcTemplate(s, data, targetFile, ` 37 package {{.PackageName}} 38 39 import ( 40 "net/http" 41 "path" 42 43 "github.com/gocaveman/caveman/filesystem/fsutil" 44 "github.com/gocaveman/caveman/tmpl" 45 "github.com/gocaveman/caveman/tmpl/tmplregistry" 46 ) 47 48 //go:generate go run {{.TargetGogenFileName}} 49 50 func init() { 51 52 // TODO: static stuff 53 54 tmplregistry.MustRegister(tmplregistry.SeqTheme, "{{.PackageName}}", NewTmplStore()) 55 56 } 57 58 func NewViewsFS() http.FileSystem { 59 return fsutil.NewHTTPFuncFS(func(name string) (http.File, error) { 60 return EmbeddedAssets.Open("/views" + path.Clean("/"+name)) 61 }) 62 } 63 64 func NewIncludesFS() http.FileSystem { 65 return fsutil.NewHTTPFuncFS(func(name string) (http.File, error) { 66 return EmbeddedAssets.Open("/includes" + path.Clean("/"+name)) 67 }) 68 } 69 70 func NewTmplStore() tmpl.Store { 71 return &tmpl.HFSStore{ 72 FileSystems: map[string]http.FileSystem{ 73 tmpl.ViewsCategory: NewViewsFS(), 74 tmpl.IncludesCategory: NewIncludesFS(), 75 }, 76 } 77 } 78 `, false) 79 if err != nil { 80 return err 81 } 82 83 err = OutputGoSrcTemplate(s, data, targetGogenFile, `// +build ignore 84 85 package main 86 87 import ( 88 "io/ioutil" 89 "log" 90 "os" 91 "regexp" 92 "strings" 93 94 "github.com/shurcooL/vfsgen" 95 "github.com/spf13/afero" 96 ) 97 98 func main() { 99 100 packageName := "{{.PackageName}}" 101 102 wd, err := os.Getwd() 103 if err != nil { 104 log.Fatal(err) 105 } 106 base := afero.NewBasePathFs(afero.NewOsFs(), wd) 107 filteredAFS := afero.NewRegexpFs(base, regexp.MustCompile("\\.(gohtml|html|css|js|jpg|png|gif|svg)$")) 108 filteredHFS := afero.NewHttpFs(filteredAFS) 109 err = vfsgen.Generate(filteredHFS, vfsgen.Options{ 110 PackageName: packageName, 111 BuildTags: "!dev", 112 VariableName: "EmbeddedAssets", 113 Filename: "{{.TargetDataFileName}}", 114 }) 115 if err != nil { 116 log.Fatalln(err) 117 } 118 119 devContents := `+"`"+`// +build dev 120 121 package __PACKAGE__ 122 123 // CODE GENERATED FILE, DO NOT EDIT! 124 125 import ( 126 "net/http" 127 ) 128 129 // EmbeddedAssets dev version loads from local filesystem. 130 var EmbeddedAssets = func() http.FileSystem { 131 return http.Dir("__LOCALPATH__") 132 }() 133 `+"`"+` 134 135 devStr := strings.Replace(string(devContents), "__PACKAGE__", packageName, -1) 136 devStr = strings.Replace(devStr, "__LOCALPATH__", wd, -1) 137 138 err = ioutil.WriteFile("{{.TargetDataDevFileName}}", []byte(devStr), 0644) 139 if err != nil { 140 log.Fatal(err) 141 } 142 143 } 144 145 `, false) 146 if err != nil { 147 return err 148 } 149 150 return nil 151 }) 152 }