github.com/vcilabs/webrpc@v0.5.2-0.20201116131534-162e27b1b33b/gen/javascript/gen.go (about)

     1  //go:generate statik -src=./templates -dest=. -f -Z -p=embed
     2  package javascript
     3  
     4  import (
     5  	"bytes"
     6  	"io/ioutil"
     7  	"os"
     8  	"text/template"
     9  
    10  	"github.com/goware/statik/fs"
    11  	"github.com/webrpc/webrpc/gen"
    12  	"github.com/webrpc/webrpc/gen/javascript/embed"
    13  	"github.com/webrpc/webrpc/schema"
    14  )
    15  
    16  func init() {
    17  	gen.Register("js", &generator{})
    18  }
    19  
    20  type generator struct{}
    21  
    22  func (g *generator) Gen(proto *schema.WebRPCSchema, opts gen.TargetOptions) (string, error) {
    23  	var schemaHash = ""
    24  	var err error
    25  	// Get templates from `embed` asset package
    26  	// NOTE: make sure to `go generate` whenever you change the files in `templates/` folder
    27  	templates, err := getTemplates()
    28  	if err != nil {
    29  		return "", err
    30  	}
    31  
    32  	// Load templates
    33  	tmpl := template.
    34  		New("webrpc-gen-js").
    35  		Funcs(templateFuncMap(opts))
    36  
    37  	for _, tmplData := range templates {
    38  		_, err = tmpl.Parse(tmplData)
    39  		if err != nil {
    40  			return "", err
    41  		}
    42  	}
    43  
    44  	// generate deterministic schema hash of the proto file
    45  	if proto.SchemaType != "go" {
    46  		schemaHash, err = proto.SchemaHash()
    47  		if err != nil {
    48  			return "", err
    49  		}
    50  	}
    51  
    52  	// template vars
    53  	vars := struct {
    54  		*schema.WebRPCSchema
    55  		SchemaHash string
    56  		TargetOpts gen.TargetOptions
    57  	}{
    58  		proto, schemaHash, opts,
    59  	}
    60  
    61  	// Generate the template
    62  	genBuf := bytes.NewBuffer(nil)
    63  	err = tmpl.ExecuteTemplate(genBuf, "proto", vars)
    64  	if err != nil {
    65  		return "", err
    66  	}
    67  
    68  	return string(genBuf.Bytes()), nil
    69  }
    70  
    71  func getTemplates() (map[string]string, error) {
    72  	data := map[string]string{}
    73  
    74  	statikFS, err := fs.New(embed.Asset)
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  
    79  	fs.Walk(statikFS, "/", func(path string, info os.FileInfo, err error) error {
    80  		if path == "/" {
    81  			return nil
    82  		}
    83  		f, err := statikFS.Open(path)
    84  		if err != nil {
    85  			return err
    86  		}
    87  		buf, err := ioutil.ReadAll(f)
    88  		if err != nil {
    89  			return err
    90  		}
    91  		data[path] = string(buf)
    92  		return nil
    93  	})
    94  
    95  	return data, nil
    96  }