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  }