Skip to content

Commit 4f527e2

Browse files
authored
webrpc-gen CLI v2 (webrpc-gen v0.6.1) (webrpc#110)
1 parent f1bc82d commit 4f527e2

40 files changed

Lines changed: 859 additions & 2473 deletions

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ jobs:
3333
- name: Regenerate examples
3434
run: make generate
3535
- name: Git diff of regenerated examples
36-
run: git diff --color --exit-code
36+
run: git diff --color --ignore-all-space --ignore-blank-lines --exit-code

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ generate:
3737
@for i in _examples/*/Makefile; do \
3838
echo; echo $$ cd $$i \&\& make generate; \
3939
cd $$(dirname $$i); \
40-
make generate; \
40+
make generate || exit 1; \
4141
cd ../../; \
4242
done
4343

cmd/webrpc-gen/main.go

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@ import (
99

1010
"github.com/webrpc/webrpc"
1111
"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"
1512
)
1613

1714
var flags = flag.NewFlagSet("webrpc-gen", flag.ExitOnError)
@@ -25,12 +22,7 @@ func main() {
2522
clientFlag := flags.Bool("client", false, "enable webrpc client library generation, default: off")
2623
serverFlag := flags.Bool("server", false, "enable webrpc server library generation, default: off")
2724

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))
25+
targetFlag := flags.String("target", "", fmt.Sprintf("target generator for webrpc library generation (required), ie. github.com/webrpc/gen-golang@v0.6.0"))
3426
targetExtra := flags.String("extra", "", "target language extra/custom options")
3527

3628
flags.Parse(os.Args[1:])
@@ -69,27 +61,14 @@ func main() {
6961
os.Exit(1)
7062
}
7163

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-
8564
targetOpts := gen.TargetOptions{
8665
PkgName: *pkgFlag,
8766
Client: *clientFlag,
8867
Server: *serverFlag,
8968
Extra: *targetExtra,
9069
}
9170

92-
protoGen, err := generator.Gen(schema, targetOpts)
71+
protoGen, err := gen.Generate(schema, *targetFlag, targetOpts)
9372
if err != nil {
9473
fmt.Println(err.Error())
9574
os.Exit(1)

gen/README.md

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,4 @@
11
# `gen` - webrpc code-generation for multiple language targets
22

3-
`gen` uses a basic templating language, along with the webrpc schema AST (abtract-syntax-tree)
3+
`gen` uses a Go [text/template](https://pkg.go.dev/text/template) language], along with the webrpc schema AST (abtract-syntax-tree)
44
to generate source code of the Web service's type system, client library and server handlers.
5-
6-
## Supported targets
7-
8-
* `go` - [gen/golang](./golang)
9-
* `ts` - [gen/typescript](./typescript)
10-
* `js` - [gen/javascript](./javascript)
11-
12-
13-
## Adding a new target
14-
15-
Adding a new target is easy, just add a folder under `gen/` and copy one of the existing
16-
targets and start adapting it for your language. Run `make build` to re-generate all templates
17-
and execute the code-generator via the `go:generate` in the target package you make.

gen/funcmap.go

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
package gen
2+
3+
import (
4+
"errors"
5+
"strconv"
6+
"strings"
7+
8+
"github.com/webrpc/webrpc/schema"
9+
)
10+
11+
func templateFuncMap(proto *schema.WebRPCSchema, opts TargetOptions) map[string]interface{} {
12+
return map[string]interface{}{
13+
// Generic template functions.
14+
"constPathPrefix": constPathPrefix,
15+
"countMethods": countMethods,
16+
"commaIfLen": commaIfLen,
17+
"isStruct": isStruct,
18+
"isEnum": isEnum,
19+
"downcaseName": downcaseName,
20+
"listComma": listComma,
21+
22+
// Golang specific template functions.
23+
"goServiceMethodName": goServiceMethodName,
24+
"goServiceMethodJSONName": goServiceMethodJSONName,
25+
"goHasGoFieldType": goHasGoFieldType(proto),
26+
"goFieldTags": goFieldTags,
27+
"goFieldType": goFieldType,
28+
"goFieldOptional": goFieldOptional,
29+
"goFieldTypeDef": goFieldTypeDef,
30+
"goNewClientServiceName": goNewClientServiceName,
31+
"goNewServerServiceName": goNewServerServiceName,
32+
"goClientServiceName": goClientServiceName,
33+
"goServerServiceName": goServerServiceName,
34+
"goMethodInputs": goMethodInputs,
35+
"goMethodOutputs": goMethodOutputs,
36+
"goMethodArgName": goMethodArgName,
37+
"goMethodArgType": goMethodArgType,
38+
"goMethodArgNames": goMethodArgNames,
39+
"goArgsList": goArgsList,
40+
"goExportedField": goExportedField,
41+
42+
// TypeScript specific template functions.
43+
"tsFieldType": tsFieldType,
44+
"tsInterfaceName": tsInterfaceName,
45+
"tsMethodName": tsMethodName,
46+
"tsMethodInputs": tsMethodInputs,
47+
"tsMethodOutputs": tsMethodOutputs,
48+
"tsNewOutputArgResponse": tsNewOutputArgResponse,
49+
"tsMethodArgumentInputInterfaceName": tsMethodArgumentInputInterfaceName,
50+
"tsMethodArgumentOutputInterfaceName": tsMethodArgumentOutputInterfaceName,
51+
"tsServiceInterfaceName": tsServiceInterfaceName,
52+
"tsExportableField": tsExportableField,
53+
"tsExportedField": tsExportedField,
54+
"tsExportedJSONField": tsExportedJSONField,
55+
"jsFieldType": jsFieldType,
56+
57+
// JavaScript specific template functions.
58+
"jsExportKeyword": jsExportKeyword(opts),
59+
"jsMethodName": jsMethodName,
60+
"jsMethodInputs": jsMethodInputs,
61+
"jsNewOutputArgResponse": jsNewOutputArgResponse,
62+
"jsServiceInterfaceName": jsServiceInterfaceName,
63+
"jsExportedJSONField": jsExportedJSONField,
64+
}
65+
}
66+
67+
func commaIfLen(in []*schema.MethodArgument) string {
68+
if len(in) > 0 {
69+
return ","
70+
}
71+
return ""
72+
}
73+
74+
func listComma(item int, count int) string {
75+
if item+1 < count {
76+
return ", "
77+
}
78+
return ""
79+
}
80+
81+
func isStruct(t schema.MessageType) bool {
82+
return t == "struct"
83+
}
84+
85+
func isEnum(t schema.MessageType) bool {
86+
return t == "enum"
87+
}
88+
89+
func downcaseName(v interface{}) (string, error) {
90+
downFn := func(s string) string {
91+
if s == "" {
92+
return ""
93+
}
94+
return strings.ToLower(s[0:1]) + s[1:]
95+
}
96+
switch t := v.(type) {
97+
case schema.VarName:
98+
return downFn(string(t)), nil
99+
case string:
100+
return downFn(t), nil
101+
default:
102+
return "", errors.New("downcaseFieldName, unknown arg type")
103+
}
104+
}
105+
106+
func constPathPrefix(in schema.VarName) (string, error) {
107+
return string(in) + "PathPrefix", nil
108+
}
109+
110+
func countMethods(in []*schema.Method) (string, error) {
111+
return strconv.Itoa(len(in)), nil
112+
}

0 commit comments

Comments
 (0)