"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"`)
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
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")
}
-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, "}")
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")
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
}
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")
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)