service.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package openapiv2
  2. import (
  3. "context"
  4. "fmt"
  5. "git.ikuban.com/server/swagger-api/protoc-gen-openapiv2/generator"
  6. "github.com/go-kratos/kratos/v2/api/metadata"
  7. "google.golang.org/grpc"
  8. "google.golang.org/protobuf/types/pluginpb"
  9. )
  10. // Service is service
  11. type Service struct {
  12. ser *metadata.Server
  13. opts []generator.Option
  14. }
  15. // New service
  16. func New(srv *grpc.Server, opts ...generator.Option) *Service {
  17. return &Service{
  18. ser: metadata.NewServer(srv),
  19. opts: opts,
  20. }
  21. }
  22. // ListServices list services
  23. func (s *Service) ListServices(ctx context.Context, in *metadata.ListServicesRequest) (*metadata.ListServicesReply, error) {
  24. return s.ser.ListServices(ctx, &metadata.ListServicesRequest{})
  25. }
  26. // GetServiceOpenAPI get service open api
  27. func (s *Service) GetServiceOpenAPI(ctx context.Context, in *metadata.GetServiceDescRequest, onlyRPC bool) (string, error) {
  28. protoSet, err := s.ser.GetServiceDesc(ctx, in)
  29. if err != nil {
  30. return "", err
  31. }
  32. files := protoSet.FileDescSet.File
  33. var target string
  34. if len(files) == 0 {
  35. return "", fmt.Errorf("proto file is empty")
  36. }
  37. if files[len(files)-1].Name == nil {
  38. return "", fmt.Errorf("proto file's name is null")
  39. }
  40. target = *files[len(files)-1].Name
  41. req := new(pluginpb.CodeGeneratorRequest)
  42. req.FileToGenerate = []string{target}
  43. var para = ""
  44. req.Parameter = &para
  45. req.ProtoFile = files
  46. g := generator.NewGenerator(s.opts...)
  47. resp, err := g.Gen(req, onlyRPC)
  48. if err != nil {
  49. return "", err
  50. }
  51. if len(resp.File) == 0 {
  52. return "{}", nil
  53. }
  54. return *resp.File[0].Content, nil
  55. }