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