service.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. fmt.Println(protoSet.String())
  33. files := protoSet.FileDescSet.File
  34. var target string
  35. if len(files) == 0 {
  36. return "", fmt.Errorf("proto file is empty")
  37. }
  38. if files[len(files)-1].Name == nil {
  39. return "", fmt.Errorf("proto file's name is null")
  40. }
  41. target = *files[len(files)-1].Name
  42. req := new(pluginpb.CodeGeneratorRequest)
  43. req.FileToGenerate = []string{target}
  44. var para = ""
  45. req.Parameter = &para
  46. req.ProtoFile = files
  47. g := generator.NewGenerator(s.opts...)
  48. resp, err := g.Gen(req, onlyRPC)
  49. if err != nil {
  50. return "", err
  51. }
  52. if len(resp.File) == 0 {
  53. return "{}", nil
  54. }
  55. return *resp.File[0].Content, nil
  56. }