Fix codec fallback and generate type imports
[govpp.git] / binapigen / generate_rpc.go
index b480f4a..4beec04 100644 (file)
@@ -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)