aboutsummaryrefslogtreecommitdiffstats
path: root/binapigen/generate_rpc.go
diff options
context:
space:
mode:
Diffstat (limited to 'binapigen/generate_rpc.go')
-rw-r--r--binapigen/generate_rpc.go49
1 files changed, 32 insertions, 17 deletions
diff --git a/binapigen/generate_rpc.go b/binapigen/generate_rpc.go
index b480f4a..4beec04 100644
--- a/binapigen/generate_rpc.go
+++ b/binapigen/generate_rpc.go
@@ -20,17 +20,31 @@ import (
"strings"
)
-func generatePackageRPC(ctx *GenFile, w io.Writer) {
+// generated service names
+const (
+ serviceApiName = "RPCService" // name for the RPC service interface
+ serviceImplName = "serviceClient" // name for the RPC service implementation
+ serviceClientName = "ServiceClient" // name for the RPC service client
+
+ // TODO: register service descriptor
+ //serviceDescType = "ServiceDesc" // name for service descriptor type
+ //serviceDescName = "_ServiceRPC_serviceDesc" // name for service descriptor var
+)
+
+func generateFileRPC(ctx *GenFile, w io.Writer) {
logf("----------------------------")
- logf("generating RPC package: %q", ctx.file.PackageName)
+ logf("generating RPC file package: %q", ctx.file.PackageName)
logf("----------------------------")
+ // generate file header
fmt.Fprintln(w, "// Code generated by GoVPP's binapi-generator. DO NOT EDIT.")
fmt.Fprintln(w)
+ // generate package header
fmt.Fprintf(w, "package %s\n", ctx.file.PackageName)
fmt.Fprintln(w)
+ // generate imports
fmt.Fprintln(w, "import (")
fmt.Fprintln(w, ` "context"`)
fmt.Fprintln(w, ` "io"`)
@@ -39,9 +53,9 @@ func generatePackageRPC(ctx *GenFile, w io.Writer) {
fmt.Fprintln(w, ")")
fmt.Fprintln(w)
- // generate services
+ // generate RPC service
if ctx.file.Service != nil && len(ctx.file.Service.RPCs) > 0 {
- generateServiceMethods(ctx, w, ctx.file.Service.RPCs)
+ generateService(ctx, w, ctx.file.Service)
}
// generate message registrations
@@ -50,6 +64,7 @@ func generatePackageRPC(ctx *GenFile, w io.Writer) {
fmt.Fprintln(w, "}")
fmt.Fprintln(w)*/
+ // generate import refs
fmt.Fprintf(w, "// Reference imports to suppress errors if they are not otherwise used.\n")
fmt.Fprintf(w, "var _ = api.RegisterMessage\n")
fmt.Fprintf(w, "var _ = context.Background\n")
@@ -57,14 +72,14 @@ func generatePackageRPC(ctx *GenFile, w io.Writer) {
}
-func generateServiceMethods(ctx *GenFile, w io.Writer, methods []RPC) {
+func generateService(ctx *GenFile, w io.Writer, svc *Service) {
// generate services comment
generateComment(ctx, w, serviceApiName, "services", "service")
// generate service api
fmt.Fprintf(w, "type %s interface {\n", serviceApiName)
- for _, svc := range methods {
- generateServiceMethod(ctx, w, &svc)
+ for _, rpc := range svc.RPCs {
+ generateRPCMethod(ctx, w, &rpc)
fmt.Fprintln(w)
}
fmt.Fprintln(w, "}")
@@ -82,21 +97,21 @@ func generateServiceMethods(ctx *GenFile, w io.Writer, methods []RPC) {
fmt.Fprintln(w, "}")
fmt.Fprintln(w)
- for _, met := range methods {
- method := camelCaseName(met.RequestMsg)
+ for _, rpc := range svc.RPCs {
+ method := camelCaseName(rpc.RequestMsg)
if m := strings.TrimSuffix(method, "Dump"); method != m {
method = "Dump" + m
}
fmt.Fprintf(w, "func (c *%s) ", serviceImplName)
- generateServiceMethod(ctx, w, &met)
+ generateRPCMethod(ctx, w, &rpc)
fmt.Fprintln(w, " {")
- if met.Stream {
+ if rpc.Stream {
streamImpl := fmt.Sprintf("%s_%sClient", serviceImplName, method)
fmt.Fprintf(w, "\tstream := c.ch.SendMultiRequest(in)\n")
fmt.Fprintf(w, "\tx := &%s{stream}\n", streamImpl)
fmt.Fprintf(w, "\treturn x, nil\n")
- } else if replyTyp := camelCaseName(met.ReplyMsg); replyTyp != "" {
+ } else if replyTyp := camelCaseName(rpc.ReplyMsg); replyTyp != "" {
fmt.Fprintf(w, "\tout := new(%s)\n", replyTyp)
fmt.Fprintf(w, "\terr:= c.ch.SendRequest(in).ReceiveReply(out)\n")
fmt.Fprintf(w, "\tif err != nil { return nil, err }\n")
@@ -108,9 +123,9 @@ func generateServiceMethods(ctx *GenFile, w io.Writer, methods []RPC) {
fmt.Fprintln(w, "}")
fmt.Fprintln(w)
- if met.Stream {
- replyTyp := camelCaseName(met.ReplyMsg)
- method := camelCaseName(met.RequestMsg)
+ if rpc.Stream {
+ replyTyp := camelCaseName(rpc.ReplyMsg)
+ method := camelCaseName(rpc.RequestMsg)
if m := strings.TrimSuffix(method, "Dump"); method != m {
method = "Dump" + m
}
@@ -143,7 +158,7 @@ func generateServiceMethods(ctx *GenFile, w io.Writer, methods []RPC) {
fmt.Fprintf(w, "\tServiceName: \"%s\",\n", ctx.moduleName)
fmt.Fprintf(w, "\tHandlerType: (*%s)(nil),\n", serviceApiName)
fmt.Fprintf(w, "\tMethods: []api.MethodDesc{\n")
- for _, method := range methods {
+ for _, method := range rpcs {
fmt.Fprintf(w, "\t {\n")
fmt.Fprintf(w, "\t MethodName: \"%s\",\n", method.Name)
fmt.Fprintf(w, "\t },\n")
@@ -157,7 +172,7 @@ func generateServiceMethods(ctx *GenFile, w io.Writer, methods []RPC) {
fmt.Fprintln(w)
}
-func generateServiceMethod(ctx *GenFile, w io.Writer, rpc *RPC) {
+func generateRPCMethod(ctx *GenFile, w io.Writer, rpc *RPC) {
reqTyp := camelCaseName(rpc.RequestMsg)
logf(" writing RPC: %+v", reqTyp)