| 438 | } |
| 439 | |
| 440 | func (g *grpc) generateServerMethod(servName, fullServName string, method *pb.MethodDescriptorProto) string { |
| 441 | methName := generator.CamelCase(method.GetName()) |
| 442 | hname := fmt.Sprintf("_%s_%s_Handler", servName, methName) |
| 443 | inType := g.typeName(method.GetInputType()) |
| 444 | outType := g.typeName(method.GetOutputType()) |
| 445 | |
| 446 | if !method.GetServerStreaming() && !method.GetClientStreaming() { |
| 447 | g.P("func ", hname, "(srv interface{}, ctx ", contextPkg, ".Context, dec func(interface{}) error, interceptor ", grpcPkg, ".UnaryServerInterceptor) (interface{}, error) {") |
| 448 | g.P("in := new(", inType, ")") |
| 449 | g.P("if err := dec(in); err != nil { return nil, err }") |
| 450 | g.P("if interceptor == nil { return srv.(", servName, "Server).", methName, "(ctx, in) }") |
| 451 | g.P("info := &", grpcPkg, ".UnaryServerInfo{") |
| 452 | g.P("Server: srv,") |
| 453 | g.P("FullMethod: ", strconv.Quote(fmt.Sprintf("/%s/%s", fullServName, methName)), ",") |
| 454 | g.P("}") |
| 455 | g.P("handler := func(ctx ", contextPkg, ".Context, req interface{}) (interface{}, error) {") |
| 456 | g.P("return srv.(", servName, "Server).", methName, "(ctx, req.(*", inType, "))") |
| 457 | g.P("}") |
| 458 | g.P("return interceptor(ctx, in, info, handler)") |
| 459 | g.P("}") |
| 460 | g.P() |
| 461 | return hname |
| 462 | } |
| 463 | streamType := unexport(servName) + methName + "Server" |
| 464 | g.P("func ", hname, "(srv interface{}, stream ", grpcPkg, ".ServerStream) error {") |
| 465 | if !method.GetClientStreaming() { |
| 466 | g.P("m := new(", inType, ")") |
| 467 | g.P("if err := stream.RecvMsg(m); err != nil { return err }") |
| 468 | g.P("return srv.(", servName, "Server).", methName, "(m, &", streamType, "{stream})") |
| 469 | } else { |
| 470 | g.P("return srv.(", servName, "Server).", methName, "(&", streamType, "{stream})") |
| 471 | } |
| 472 | g.P("}") |
| 473 | g.P() |
| 474 | |
| 475 | genSend := method.GetServerStreaming() |
| 476 | genSendAndClose := !method.GetServerStreaming() |
| 477 | genRecv := method.GetClientStreaming() |
| 478 | |
| 479 | // Stream auxiliary types and methods. |
| 480 | g.P("type ", servName, "_", methName, "Server interface {") |
| 481 | if genSend { |
| 482 | g.P("Send(*", outType, ") error") |
| 483 | } |
| 484 | if genSendAndClose { |
| 485 | g.P("SendAndClose(*", outType, ") error") |
| 486 | } |
| 487 | if genRecv { |
| 488 | g.P("Recv() (*", inType, ", error)") |
| 489 | } |
| 490 | g.P(grpcPkg, ".ServerStream") |
| 491 | g.P("}") |
| 492 | g.P() |
| 493 | |
| 494 | g.P("type ", streamType, " struct {") |
| 495 | g.P(grpcPkg, ".ServerStream") |
| 496 | g.P("}") |
| 497 | g.P() |