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  }