forked from chanced/openapi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreference.go
181 lines (144 loc) · 5.36 KB
/
reference.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package openapi
import (
"encoding/json"
"errors"
"github.com/chanced/openapi/yamlutil"
"github.com/tidwall/gjson"
)
type ParameterResolver func(ref string) (*ParameterObj, error)
type ResponseResolver func(ref string) (*ResponseObj, error)
type ExampleResolver func(ref string) (*ExampleObj, error)
type HeaderResolver func(ref string) (*HeaderObj, error)
type RequestBodyResolver func(ref string) (*RequestBodyObj, error)
type CallbackResolver func(ref string) (*CallbackObj, error)
type PathResolver func(ref string) (*PathObj, error)
type SecuritySchemeResolver func(ref string) (*SecuritySchemeObj, error)
type LinkResolver func(ref string) (*LinkObj, error)
type SchemaResolver func(ref string) (*SchemaObj, error)
// Referencable is any object type which could also be a Reference
type Referencable interface {
IsRef() bool
}
// ErrNotReference indicates not a reference
var ErrNotReference = errors.New("error: data is not a Reference")
// Reference is simple object to allow referencing other components in the
// OpenAPI document, internally and externally.
//
// The $ref string value contains a URI
// [RFC3986](https://datatracker.ietf.org/doc/html/rfc3986), which identifies
// the location of the value being referenced.
//
// See the [rules for resolving Relative
// References](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#relativeReferencesURI).
type Reference struct {
// The reference identifier. This MUST be in the form of a URI.
//
// *required*
Ref string `yaml:"$ref" json:"$ref"`
// A short summary which by default SHOULD override that of the referenced
// component. If the referenced object-type does not allow a summary field,
// then this field has no effect.
Summary string `yaml:"summary,omitempty" json:"summary,omitempty"`
// A description which by default SHOULD override that of the referenced
// component. CommonMark syntax MAY be used for rich text representation. If
// the referenced object-type does not allow a description field, then this
// field has no effect.
Description string `yaml:"description" json:"description,omitempty"`
}
// MarshalYAML marshals YAML
func (r Reference) MarshalYAML() (interface{}, error) {
return yamlutil.Marshal(r)
}
// UnmarshalYAML unmarshals YAML
func (r *Reference) UnmarshalYAML(unmarshal func(interface{}) error) error {
return yamlutil.Unmarshal(unmarshal, r)
}
// ParameterKind returns ParameterKindReference
func (r *Reference) ParameterKind() ParameterKind {
return ParameterKindReference
}
// ResponseKind distinguishes Reference by returning HeaderKindRef
func (r *Reference) ResponseKind() ResponseKind {
return ResponseKindRef
}
// ExampleKind distinguishes Reference by returning HeaderKindRef
func (r *Reference) ExampleKind() ExampleKind {
return ExampleKindRef
}
// HeaderKind distinguishes Reference by returning HeaderKindRef
func (r *Reference) HeaderKind() HeaderKind {
return HeaderKindRef
}
// RequestBodyKind returns RequestBodyKindRef
func (r *Reference) RequestBodyKind() RequestBodyKind {
return RequestBodyKindRef
}
// CallbackKind returns CallbackKindRef
func (r *Reference) CallbackKind() CallbackKind {
return CallbackKindRef
}
// PathKind returns PathKindRef
func (r *Reference) PathKind() PathKind {
return PathKindRef
}
// SecuritySchemeKind returns SecuritySchemeKindRef
func (r *Reference) SecuritySchemeKind() SecuritySchemeKind {
return SecuritySchemeKindRef
}
// LinkKind returns LinkKindRef
func (r *Reference) LinkKind() LinkKind {
return LinkKindRef
}
// ResolveParameter resolves r by invoking resolve
func (r *Reference) ResolveParameter(resolve ParameterResolver) (*ParameterObj, error) {
return resolve(r.Ref)
}
// ResolveResponse resolves r by invoking resolve
func (r *Reference) ResolveResponse(resolve ResponseResolver) (*ResponseObj, error) {
return resolve(r.Ref)
}
// ResolveExample resolves r by invoking resolve
func (r *Reference) ResolveExample(resolve ExampleResolver) (*ExampleObj, error) {
return resolve(r.Ref)
}
// ResolveHeader resolves r by invoking resolve
func (r *Reference) ResolveHeader(resolve HeaderResolver) (*HeaderObj, error) {
return resolve(r.Ref)
}
// ResolveRequestBody resolves r by invoking resolve
func (r *Reference) ResolveRequestBody(resolve RequestBodyResolver) (*RequestBodyObj, error) {
return resolve(r.Ref)
}
// ResolveCallback resolves r by invoking resolve
func (r *Reference) ResolveCallback(resolve CallbackResolver) (*CallbackObj, error) {
return resolve(r.Ref)
}
// ResolvePath resolves r by invoking resolve
func (r *Reference) ResolvePath(resolve PathResolver) (*PathObj, error) {
return resolve(r.Ref)
}
// ResolveSecurityScheme resolves r by invoking resolve
func (r *Reference) ResolveSecurityScheme(resolve SecuritySchemeResolver) (*SecuritySchemeObj, error) {
return resolve(r.Ref)
}
// ResolveLink resolves r by invoking resolve
func (r *Reference) ResolveLink(resolve LinkResolver) (*LinkObj, error) {
return resolve(r.Ref)
}
func isRefJSON(data []byte) bool {
r := gjson.GetBytes(data, "$ref")
return r.Str != ""
}
func unmarshalReferenceJSON(data []byte) (*Reference, error) {
if !isRefJSON(data) {
return nil, ErrNotReference
}
var r Reference
return &r, json.Unmarshal(data, &r)
}
var _ SecurityScheme = (*Reference)(nil)
var _ Path = (*Reference)(nil)
var _ Response = (*Reference)(nil)
var _ Example = (*Reference)(nil)
var _ Parameter = (*Reference)(nil)
var _ Header = (*Reference)(nil)