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 }