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

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/webrpc/webrpc"
    11  	"github.com/webrpc/webrpc/gen"
    12  	_ "github.com/webrpc/webrpc/gen/golang"
    13  	_ "github.com/webrpc/webrpc/gen/javascript"
    14  	_ "github.com/webrpc/webrpc/gen/typescript"
    15  )
    16  
    17  var flags = flag.NewFlagSet("webrpc-gen", flag.ExitOnError)
    18  
    19  func main() {
    20  	versionFlag := flags.Bool("version", false, "print webrpc version and exit")
    21  	schemaFlag := flags.String("schema", "", "webrpc schema file (required)")
    22  	pkgFlag := flags.String("pkg", "proto", "generated package name for target language, default: proto")
    23  	outFlag := flags.String("out", "", "generated output file, default: stdout")
    24  	testFlag := flags.Bool("test", false, "test schema parsing (skips code-gen)")
    25  	clientFlag := flags.Bool("client", false, "enable webrpc client library generation, default: off")
    26  	serverFlag := flags.Bool("server", false, "enable webrpc server library generation, default: off")
    27  
    28  	// registered/available target languages
    29  	targets := []string{}
    30  	for k, _ := range gen.Generators {
    31  		targets = append(targets, k)
    32  	}
    33  	targetFlag := flags.String("target", "", fmt.Sprintf("target language for webrpc library generation, %s (required)", targets))
    34  	targetExtra := flags.String("extra", "", "target language extra/custom options")
    35  
    36  	flags.Parse(os.Args[1:])
    37  
    38  	if *versionFlag {
    39  		fmt.Printf("webrpc %s\n", webrpc.VERSION)
    40  		os.Exit(0)
    41  	}
    42  
    43  	if *schemaFlag == "" {
    44  		fmt.Println("oops, you must pass a -schema flag, see -h for help/usage")
    45  		os.Exit(1)
    46  	}
    47  
    48  	// Parse+validate the webrpc schema file
    49  	schema, err := webrpc.ParseSchemaFile(*schemaFlag)
    50  	if err != nil {
    51  		fmt.Println(err.Error())
    52  		os.Exit(1)
    53  	}
    54  
    55  	// Test the schema file (useful for ridl files)
    56  	if *testFlag {
    57  		jout, err := schema.ToJSON(true)
    58  		if err != nil {
    59  			fmt.Println(err.Error())
    60  			os.Exit(1)
    61  		}
    62  		fmt.Println(jout)
    63  		os.Exit(0)
    64  	}
    65  
    66  	// Code-gen targets
    67  	if *targetFlag == "" {
    68  		fmt.Println("oops, you must pass a -target flag, see -h for help/usage")
    69  		os.Exit(1)
    70  	}
    71  
    72  	targetLang := *targetFlag
    73  	if _, ok := gen.Generators[targetLang]; !ok {
    74  		fmt.Printf("oops, you passed an invalid -target flag, try one of registered generators: %s\n", targets)
    75  		os.Exit(1)
    76  	}
    77  
    78  	// Call our target code-generator
    79  	generator := gen.GetGenerator(*targetFlag)
    80  	if generator == nil {
    81  		fmt.Printf("error! unable to find generator for target '%s'\n", *targetFlag)
    82  		os.Exit(1)
    83  	}
    84  
    85  	targetOpts := gen.TargetOptions{
    86  		PkgName: *pkgFlag,
    87  		Client:  *clientFlag,
    88  		Server:  *serverFlag,
    89  		Extra:   *targetExtra,
    90  	}
    91  
    92  	protoGen, err := generator.Gen(schema, targetOpts)
    93  	if err != nil {
    94  		fmt.Println(err.Error())
    95  		os.Exit(1)
    96  	}
    97  
    98  	// Write output
    99  	if *outFlag != "" && *outFlag != "stdout" {
   100  		outfile := *outFlag
   101  		cwd, err := os.Getwd()
   102  		if err != nil {
   103  			fmt.Println(err.Error())
   104  			os.Exit(1)
   105  		}
   106  		if outfile[0:1] != "/" {
   107  			outfile = filepath.Join(cwd, outfile)
   108  		}
   109  
   110  		outdir := filepath.Dir(outfile)
   111  		if _, err := os.Stat(outdir); os.IsNotExist(err) {
   112  			err := os.MkdirAll(outdir, 0755)
   113  			if err != nil {
   114  				fmt.Println(err.Error())
   115  				os.Exit(1)
   116  			}
   117  		}
   118  
   119  		err = ioutil.WriteFile(outfile, []byte(protoGen), 0644)
   120  		if err != nil {
   121  			fmt.Println(err.Error())
   122  			os.Exit(1)
   123  		}
   124  	} else {
   125  		fmt.Println(protoGen)
   126  	}
   127  }