generator.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package generator
  2. import (
  3. "git.ikuban.com/server/swagger-api/protoc-gen-openapiv2/internal/codegenerator"
  4. "git.ikuban.com/server/swagger-api/protoc-gen-openapiv2/internal/descriptor"
  5. "git.ikuban.com/server/swagger-api/protoc-gen-openapiv2/internal/genopenapi"
  6. "google.golang.org/protobuf/types/pluginpb"
  7. )
  8. // Generator is openapi v2 generator
  9. type Generator struct {
  10. reg *descriptor.Registry
  11. }
  12. // NewGenerator return Generator
  13. func NewGenerator(options ...Option) *Generator {
  14. gen := &Generator{
  15. reg: descriptor.NewRegistry(),
  16. }
  17. gen.reg.SetUseJSONNamesForFields(true)
  18. gen.reg.SetRecursiveDepth(1024)
  19. gen.reg.SetMergeFileName("apidocs")
  20. gen.reg.SetDisableDefaultErrors(true)
  21. for _, o := range options {
  22. o(gen)
  23. }
  24. return gen
  25. }
  26. // Gen generates openapi v2 json content
  27. func (g *Generator) Gen(req *pluginpb.CodeGeneratorRequest, onlyRPC bool) (*pluginpb.CodeGeneratorResponse, error) {
  28. reg := g.reg
  29. if reg == nil {
  30. reg = NewGenerator().reg
  31. }
  32. reg.SetGenerateRPCMethods(onlyRPC)
  33. if err := reg.SetRepeatedPathParamSeparator("csv"); err != nil {
  34. return nil, err
  35. }
  36. gen := genopenapi.New(reg)
  37. if err := genopenapi.AddErrorDefs(reg); err != nil {
  38. return nil, err
  39. }
  40. if err := reg.Load(req); err != nil {
  41. return nil, err
  42. }
  43. var targets []*descriptor.File
  44. for _, target := range req.FileToGenerate {
  45. f, err := reg.LookupFile(target)
  46. if err != nil {
  47. return nil, err
  48. }
  49. targets = append(targets, f)
  50. }
  51. out, err := gen.Generate(targets)
  52. if err != nil {
  53. return nil, err
  54. }
  55. return emitFiles(out), nil
  56. }
  57. func emitFiles(out []*descriptor.ResponseFile) *pluginpb.CodeGeneratorResponse {
  58. files := make([]*pluginpb.CodeGeneratorResponse_File, len(out))
  59. for idx, item := range out {
  60. files[idx] = item.CodeGeneratorResponse_File
  61. }
  62. resp := &pluginpb.CodeGeneratorResponse{File: files}
  63. codegenerator.SetSupportedFeaturesOnCodeGeneratorResponse(resp)
  64. return resp
  65. }