github.com/vcilabs/webrpc@v0.5.2-0.20201116131534-162e27b1b33b/gen/golang/gen.go (about) 1 //go:generate statik -src=./templates -dest=. -f -Z -p=embed 2 package golang 3 4 import ( 5 "bytes" 6 "io/ioutil" 7 "os" 8 "text/template" 9 10 "github.com/goware/statik/fs" 11 "github.com/pkg/errors" 12 "github.com/webrpc/webrpc/gen" 13 "github.com/webrpc/webrpc/gen/golang/embed" 14 "github.com/webrpc/webrpc/schema" 15 ) 16 17 func init() { 18 gen.Register("go", &generator{}) 19 } 20 21 type generator struct{} 22 23 func (g *generator) Gen(proto *schema.WebRPCSchema, opts gen.TargetOptions) (string, error) { 24 var schemaHash = "" 25 var err error 26 // Get templates from `embed` asset package 27 // NOTE: make sure to `go generate` whenever you change the files in `templates/` folder 28 templates, err := getTemplates() 29 if err != nil { 30 return "", err 31 } 32 33 // TODO: we can move a bunch of this code to the core gen package at githb.com/webrpc/webrpc/gen 34 // .. then typescript gen, and others can use it too.. 35 36 // Load templates 37 tmpl := template. 38 New("webrpc-gen-go"). 39 Funcs(templateFuncMap(proto)) 40 41 for _, tmplData := range templates { 42 _, err = tmpl.Parse(tmplData) 43 if err != nil { 44 return "", err 45 } 46 } 47 48 // generate deterministic schema hash of the proto file 49 if proto.SchemaType != "go" { 50 schemaHash, err = proto.SchemaHash() 51 if err != nil { 52 return "", err 53 } 54 } 55 56 // template vars 57 vars := struct { 58 *schema.WebRPCSchema 59 SchemaHash string 60 TargetOpts gen.TargetOptions 61 }{ 62 proto, schemaHash, opts, 63 } 64 // generate the template 65 genBuf := bytes.NewBuffer(nil) 66 err = tmpl.ExecuteTemplate(genBuf, "proto", vars) 67 if err != nil { 68 return "", err 69 } 70 71 // if proto.SchemaType == "go" { 72 // return string(genBuf.Bytes()), nil 73 // } 74 75 src, err := FormatSource(genBuf.Bytes()) 76 if err != nil { 77 return "", errors.Errorf("gofmt is failing to format the Go code because: %v", err) 78 } 79 80 return string(src), nil 81 } 82 83 func getTemplates() (map[string]string, error) { 84 data := map[string]string{} 85 86 statikFS, err := fs.New(embed.Asset) 87 if err != nil { 88 return nil, err 89 } 90 91 fs.Walk(statikFS, "/", func(path string, info os.FileInfo, err error) error { 92 if path == "/" { 93 return nil 94 } 95 f, err := statikFS.Open(path) 96 if err != nil { 97 return err 98 } 99 buf, err := ioutil.ReadAll(f) 100 if err != nil { 101 return err 102 } 103 data[path] = string(buf) 104 return nil 105 }) 106 return data, nil 107 }