openapi_configuration.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package descriptor
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "git.ikuban.com/server/swagger-api/protoc-gen-openapiv2/internal/descriptor/openapiconfig"
  6. "github.com/ghodss/yaml"
  7. "google.golang.org/protobuf/encoding/protojson"
  8. )
  9. func loadOpenAPIConfigFromYAML(yamlFileContents []byte, yamlSourceLogName string) (*openapiconfig.OpenAPIConfig, error) {
  10. jsonContents, err := yaml.YAMLToJSON(yamlFileContents)
  11. if err != nil {
  12. return nil, fmt.Errorf("failed to convert OpenAPI Configuration from YAML in '%v' to JSON: %v", yamlSourceLogName, err)
  13. }
  14. // Reject unknown fields because OpenAPIConfig is only used here
  15. unmarshaler := protojson.UnmarshalOptions{
  16. DiscardUnknown: false,
  17. }
  18. openapiConfiguration := openapiconfig.OpenAPIConfig{}
  19. if err := unmarshaler.Unmarshal(jsonContents, &openapiConfiguration); err != nil {
  20. return nil, fmt.Errorf("failed to parse gRPC API Configuration from YAML in '%v': %v", yamlSourceLogName, err)
  21. }
  22. return &openapiConfiguration, nil
  23. }
  24. func registerOpenAPIOptions(registry *Registry, openAPIConfig *openapiconfig.OpenAPIConfig, yamlSourceLogName string) error {
  25. if openAPIConfig.OpenapiOptions == nil {
  26. // Nothing to do
  27. return nil
  28. }
  29. if err := registry.RegisterOpenAPIOptions(openAPIConfig.OpenapiOptions); err != nil {
  30. return fmt.Errorf("failed to register option in %s: %s", yamlSourceLogName, err)
  31. }
  32. return nil
  33. }
  34. // LoadOpenAPIConfigFromYAML loads an OpenAPI Configuration from the given YAML file
  35. // and registers the OpenAPI options the given registry.
  36. // This must be done after loading the proto file.
  37. func (r *Registry) LoadOpenAPIConfigFromYAML(yamlFile string) error {
  38. yamlFileContents, err := ioutil.ReadFile(yamlFile)
  39. if err != nil {
  40. return fmt.Errorf("failed to read gRPC API Configuration description from '%v': %v", yamlFile, err)
  41. }
  42. config, err := loadOpenAPIConfigFromYAML(yamlFileContents, yamlFile)
  43. if err != nil {
  44. return err
  45. }
  46. return registerOpenAPIOptions(r, config, yamlFile)
  47. }