resolver.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. package spec
  2. import (
  3. "fmt"
  4. "github.com/go-openapi/swag"
  5. )
  6. func resolveAnyWithBase(root interface{}, ref *Ref, result interface{}, options *ExpandOptions) error {
  7. options = optionsOrDefault(options)
  8. resolver := defaultSchemaLoader(root, options, nil, nil)
  9. if err := resolver.Resolve(ref, result, options.RelativeBase); err != nil {
  10. return err
  11. }
  12. return nil
  13. }
  14. // ResolveRefWithBase resolves a reference against a context root with preservation of base path
  15. func ResolveRefWithBase(root interface{}, ref *Ref, options *ExpandOptions) (*Schema, error) {
  16. result := new(Schema)
  17. if err := resolveAnyWithBase(root, ref, result, options); err != nil {
  18. return nil, err
  19. }
  20. return result, nil
  21. }
  22. // ResolveRef resolves a reference for a schema against a context root
  23. // ref is guaranteed to be in root (no need to go to external files)
  24. //
  25. // ResolveRef is ONLY called from the code generation module
  26. func ResolveRef(root interface{}, ref *Ref) (*Schema, error) {
  27. res, _, err := ref.GetPointer().Get(root)
  28. if err != nil {
  29. return nil, err
  30. }
  31. switch sch := res.(type) {
  32. case Schema:
  33. return &sch, nil
  34. case *Schema:
  35. return sch, nil
  36. case map[string]interface{}:
  37. newSch := new(Schema)
  38. if err = swag.DynamicJSONToStruct(sch, newSch); err != nil {
  39. return nil, err
  40. }
  41. return newSch, nil
  42. default:
  43. return nil, fmt.Errorf("type: %T: %w", sch, ErrUnknownTypeForReference)
  44. }
  45. }
  46. // ResolveParameterWithBase resolves a parameter reference against a context root and base path
  47. func ResolveParameterWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Parameter, error) {
  48. result := new(Parameter)
  49. if err := resolveAnyWithBase(root, &ref, result, options); err != nil {
  50. return nil, err
  51. }
  52. return result, nil
  53. }
  54. // ResolveParameter resolves a parameter reference against a context root
  55. func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) {
  56. return ResolveParameterWithBase(root, ref, nil)
  57. }
  58. // ResolveResponseWithBase resolves response a reference against a context root and base path
  59. func ResolveResponseWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Response, error) {
  60. result := new(Response)
  61. err := resolveAnyWithBase(root, &ref, result, options)
  62. if err != nil {
  63. return nil, err
  64. }
  65. return result, nil
  66. }
  67. // ResolveResponse resolves response a reference against a context root
  68. func ResolveResponse(root interface{}, ref Ref) (*Response, error) {
  69. return ResolveResponseWithBase(root, ref, nil)
  70. }
  71. // ResolvePathItemWithBase resolves response a path item against a context root and base path
  72. func ResolvePathItemWithBase(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) {
  73. result := new(PathItem)
  74. if err := resolveAnyWithBase(root, &ref, result, options); err != nil {
  75. return nil, err
  76. }
  77. return result, nil
  78. }
  79. // ResolvePathItem resolves response a path item against a context root and base path
  80. //
  81. // Deprecated: use ResolvePathItemWithBase instead
  82. func ResolvePathItem(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) {
  83. return ResolvePathItemWithBase(root, ref, options)
  84. }
  85. // ResolveItemsWithBase resolves parameter items reference against a context root and base path.
  86. //
  87. // NOTE: stricly speaking, this construct is not supported by Swagger 2.0.
  88. // Similarly, $ref are forbidden in response headers.
  89. func ResolveItemsWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) {
  90. result := new(Items)
  91. if err := resolveAnyWithBase(root, &ref, result, options); err != nil {
  92. return nil, err
  93. }
  94. return result, nil
  95. }
  96. // ResolveItems resolves parameter items reference against a context root and base path.
  97. //
  98. // Deprecated: use ResolveItemsWithBase instead
  99. func ResolveItems(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) {
  100. return ResolveItemsWithBase(root, ref, options)
  101. }