Refactoring and fixes
[govpp.git] / binapigen / gen_rpc.go
index ba23f4a..fa123f0 100644 (file)
@@ -71,7 +71,7 @@ func GenerateRPC(gen *Generator, file *File) *GenFile {
 
 func genService(g *GenFile, svc *Service) {
        // generate comment
-       g.P("// ", serviceApiName, " defines RPC service  ", g.file.Desc.Name, ".")
+       g.P("// ", serviceApiName, " defines RPC service ", g.file.Desc.Name, ".")
 
        // generate service interface
        g.P("type ", serviceApiName, " interface {")
@@ -152,6 +152,8 @@ func genService(g *GenFile, svc *Service) {
                        g.P("   case *", msgDetails.GoIdent, ":")
                        g.P("           return m, nil")
                        g.P("   case *", msgReply.GoIdent, ":")
+                       g.P("           err = c.Stream.Close()")
+                       g.P("           if err != nil { return nil, err }")
                        g.P("           return nil, ", ioPkg.Ident("EOF"))
                        g.P("   default:")
                        g.P("           return nil, ", fmtPkg.Ident("Errorf"), "(\"unexpected message: %T %v\", m, m)")
@@ -160,12 +162,22 @@ func genService(g *GenFile, svc *Service) {
                        g.P("out := new(", rpc.MsgReply.GoIdent, ")")
                        g.P("err := c.conn.Invoke(ctx, in, out)")
                        g.P("if err != nil { return nil, err }")
-                       g.P("return out, nil")
+                       if retvalField := getRetvalField(rpc.MsgReply); retvalField != nil {
+                               if fieldType := getFieldType(g, retvalField); fieldType == "int32" {
+                                       g.P("return out, ", govppApiPkg.Ident("RetvalToVPPApiError"), "(out.", retvalField.GoName, ")")
+                               } else {
+                                       g.P("return out, ", govppApiPkg.Ident("RetvalToVPPApiError"), "(int32(out.", retvalField.GoName, "))")
+                               }
+                       } else {
+                               g.P("return out, nil")
+                       }
                } else {
                        g.P("stream, err := c.conn.NewStream(ctx)")
                        g.P("if err != nil { return err }")
                        g.P("err = stream.SendMsg(in)")
                        g.P("if err != nil { return err }")
+                       g.P("err = stream.Close()")
+                       g.P("if err != nil { return err }")
                        g.P("return nil")
                }
                g.P("}")