bm_generate.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package genbm
  2. import (
  3. "fmt"
  4. "io"
  5. "go-common/app/tool/protoc-gen-bm/util"
  6. )
  7. const (
  8. bmPkgPath = "go-common/library/net/http/blademaster"
  9. )
  10. // BMGenerate generate bm server code
  11. type BMGenerate struct {
  12. target io.Writer
  13. packageName string
  14. descs []*BMServerDescriptor
  15. err error
  16. jsonpb bool
  17. }
  18. // NewBMGenerate BMGenerate
  19. func NewBMGenerate(packageName string, descs []*BMServerDescriptor, jsonpb bool) *BMGenerate {
  20. return &BMGenerate{
  21. packageName: packageName,
  22. descs: descs,
  23. jsonpb: jsonpb,
  24. }
  25. }
  26. // Generate code
  27. func (b *BMGenerate) Generate(target io.Writer) error {
  28. b.target = target
  29. methodsCount := 0
  30. for _, desc := range b.descs {
  31. methodsCount += len(desc.Methods)
  32. }
  33. // if not methods found, can't generate anything
  34. if methodsCount == 0 {
  35. return nil
  36. }
  37. b.generatePackageImport()
  38. for _, desc := range b.descs {
  39. b.generateServer(desc)
  40. }
  41. return b.err
  42. }
  43. // P print code
  44. func (b *BMGenerate) P(args ...interface{}) {
  45. if b.err != nil {
  46. return
  47. }
  48. args = append(args, "\n")
  49. _, b.err = fmt.Fprint(b.target, args...)
  50. }
  51. func (b *BMGenerate) generatePackageImport() {
  52. b.P("// Package ", b.packageName, " Code generated by go-common/app/tool/protoc-gen-bm. DO NOT EDIT.")
  53. b.P("package ", b.packageName)
  54. b.P()
  55. b.P("import (")
  56. b.P(" \"context\"")
  57. if b.jsonpb {
  58. b.P(" \"bytes\"")
  59. b.P(" \"encoding/json\"")
  60. b.P()
  61. b.P(" \"go-common/app/tool/protoc-gen-bm/jsonpb\"")
  62. }
  63. b.P()
  64. b.P(" bm \"", bmPkgPath, "\"")
  65. b.P(")")
  66. b.P()
  67. }
  68. func (b *BMGenerate) generateServer(desc *BMServerDescriptor) {
  69. b.generateServerInterface(desc)
  70. b.generateServerHandler(desc)
  71. b.generateRegisterFunc(desc)
  72. }
  73. func (b *BMGenerate) generateServerInterface(desc *BMServerDescriptor) {
  74. serviceName := util.CamelCase(desc.Name)
  75. b.P(fmt.Sprintf("// BM%sServer interface as same as gGRPC server define", serviceName))
  76. b.P("type BM", serviceName, "Server interface {")
  77. for _, method := range desc.Methods {
  78. b.P(" ", util.CamelCase(method.Name), fmt.Sprintf("(context.Context, *%s) (*%s, error)", method.RequestType, method.ReplyType))
  79. }
  80. b.P("}")
  81. b.P()
  82. }
  83. func (b *BMGenerate) generateServerHandler(desc *BMServerDescriptor) {
  84. serviceName := util.CamelCase(desc.Name)
  85. receiverName := fmt.Sprintf("_BMServer%s", serviceName)
  86. b.P("// _BMServer", serviceName, "server")
  87. b.P("type ", receiverName, " struct {")
  88. b.P(" BM", serviceName, "Server")
  89. b.P("}")
  90. b.P()
  91. for _, method := range desc.Methods {
  92. methodName := util.CamelCase(method.Name)
  93. funcName := fmt.Sprintf("bm%s%sHandler", serviceName, methodName)
  94. b.P(fmt.Sprintf("func (b *%s) ", receiverName), funcName, "(c *bm.Context) {")
  95. // bind req
  96. b.P(fmt.Sprintf(" req := new(%s)", method.RequestType))
  97. b.P(fmt.Sprintf(" if err := c.Bind(req); err != nil {"))
  98. b.P(" return")
  99. b.P(" }")
  100. // call service
  101. b.P(fmt.Sprintf(" reply, err := b.%s(c.Context, req)", methodName))
  102. if b.jsonpb {
  103. b.P(" if err != nil {")
  104. b.P(" c.JSON(nil, err)")
  105. b.P(" return")
  106. b.P(" }")
  107. b.P(" body := &bytes.Buffer{}")
  108. b.P(" marshaler := jsonpb.Marshaler{EmitDefaults: true, OrigName: true}")
  109. b.P(" err = marshaler.Marshal(body, reply)")
  110. b.P(" c.JSON(json.RawMessage(body.Bytes()), err)")
  111. } else {
  112. b.P(" c.JSON(reply, err)")
  113. }
  114. b.P("}")
  115. b.P()
  116. }
  117. }
  118. func (b *BMGenerate) generateRegisterFunc(desc *BMServerDescriptor) {
  119. serviceName := util.CamelCase(desc.Name)
  120. receiverName := fmt.Sprintf("_BMServer%s", serviceName)
  121. b.P(fmt.Sprintf("// Register%sBMServer register bm server", serviceName))
  122. b.P(fmt.Sprintf("func Register%sBMServer(e *bm.Engine, s BM%sServer) {", serviceName, serviceName))
  123. b.P(fmt.Sprintf(" bs := &%s{s}", receiverName))
  124. for _, method := range desc.Methods {
  125. methodName := util.CamelCase(method.Name)
  126. funcName := fmt.Sprintf("bm%s%sHandler", serviceName, methodName)
  127. b.P(fmt.Sprintf(" e.%s(\"%s\", bs.%s)", method.Method, method.PathPattern, funcName))
  128. }
  129. b.P("}")
  130. b.P()
  131. }