-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathheader.go
217 lines (188 loc) · 6.58 KB
/
header.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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
package openapi
import (
"encoding/json"
"github.com/chanced/jsonx"
"github.com/chanced/transcode"
"gopkg.in/yaml.v3"
)
// HeaderMap holds reusable HeaderMap.
type HeaderMap = ComponentMap[*Header]
// Header follows the structure of the Parameter Object with the following
// changes:
// - name MUST NOT be specified, it is given in the corresponding headers map.
// - in MUST NOT be specified, it is implicitly in header.
// - All traits that are affected by the location MUST be applicable to a
// location of header (for example, style).
type Header struct {
// OpenAPI extensions
Extensions `json:"-"`
Location `json:"-"`
// A brief description of the parameter. This could contain examples of use.
// CommonMark syntax MAY be used for rich text representation.
Description Text `json:"description,omitempty"`
// Determines whether this parameter is mandatory. If the parameter location
// is "path", this property is REQUIRED and its value MUST be true.
// Otherwise, the property MAY be included and its default value is false.
Required *bool `json:"required,omitempty"`
// Specifies that a parameter is deprecated and SHOULD be transitioned out
// of usage. Default value is false.
Deprecated *bool `json:"deprecated,omitempty"`
// Sets the ability to pass empty-valued parameters. This is valid only for
// query parameters and allows sending a parameter with an empty value.
// Default value is false. If style is used, and if behavior is n/a (cannot
// be serialized), the value of allowEmptyValue SHALL be ignored. Use of
// this property is NOT RECOMMENDED, as it is likely to be removed in a
// later revision.
AllowEmptyValue *bool `json:"allowEmptyValue,omitempty"`
// Describes how the parameter value will be serialized depending on the
// type of the parameter value.
// Default values (based on value of in):
// - for query - form;
// - for path - simple;
// - for header - simple;
// - for cookie - form.
Style Text `json:"style,omitempty"`
// When this is true, parameter values of type array or object generate
// separate parameters for each value of the array or key-value pair of the
// map. For other types of parameters this property has no effect. When
// style is form, the default value is true. For all other styles, the
// default value is false.
Explode *bool `json:"explode,omitempty"`
// Determines whether the parameter value SHOULD allow reserved characters,
// as defined by RFC3986 :/?#[]@!$&'()*+,;= to be included without
// percent-encoding. This property only applies to parameters with an in
// value of query. The default value is false.
AllowReserved *bool `json:"allowReserved,omitempty"`
// The schema defining the type used for the parameter.
Schema *Schema `json:"schema,omitempty"`
// Examples of the parameter's potential value. Each example SHOULD
// contain a value in the correct format as specified in the parameter
// encoding. The examples field is mutually exclusive of the example
// field. Furthermore, if referencing a schema that contains an example,
// the examples value SHALL override the example provided by the schema.
Examples *ExampleMap `json:"examples,omitempty"`
// Example of the parameter's potential value. The example SHOULD match the
// specified schema and encoding properties if present. The example field is
// mutually exclusive of the examples field. Furthermore, if referencing a
// schema that contains an example, the example value SHALL override the
// example provided by the schema. To represent examples of media types that
// cannot naturally be represented in JSON or YAML, a string value can
// contain the example with escaping where necessary.
Example jsonx.RawMessage `json:"example,omitempty"`
}
func (h *Header) Nodes() []Node {
if h == nil {
return nil
}
return downcastNodes(h.nodes())
}
func (h *Header) nodes() []node {
return appendEdges(nil, h.Schema, h.Examples)
}
func (h *Header) Refs() []Ref {
if h == nil {
return nil
}
var refs []Ref
refs = append(refs, h.Schema.Refs()...)
refs = append(refs, h.Examples.Refs()...)
return refs
}
func (h *Header) Anchors() (*Anchors, error) {
if h == nil {
return nil, nil
}
var anchors *Anchors
var err error
if anchors, err = h.Schema.Anchors(); err != nil {
return nil, err
}
if anchors, err = anchors.merge(h.Examples.Anchors()); err != nil {
return nil, err
}
return anchors, nil
}
func (*Header) Kind() Kind { return KindHeader }
func (*Header) mapKind() Kind { return KindHeaderMap }
func (*Header) sliceKind() Kind { return KindHeaderSlice }
func (h Header) MarshalJSON() ([]byte, error) {
type header Header
return marshalExtendedJSON(header(h))
}
// UnmarshalJSON unmarshals json into h
func (h *Header) UnmarshalJSON(data []byte) error {
type header Header
v := header{}
err := unmarshalExtendedJSON(data, &v)
*h = Header(v)
return err
}
// UnmarshalYAML satisfies gopkg.in/yaml.v3 Marshaler interface
func (h Header) MarshalYAML() (interface{}, error) {
j, err := h.MarshalJSON()
if err != nil {
return nil, err
}
var v interface{}
err = json.Unmarshal(j, &v)
if err != nil {
return nil, err
}
return v, nil
}
// UnmarshalYAML satisfies gopkg.in/yaml.v3 Unmarshaler interface
func (h *Header) UnmarshalYAML(value *yaml.Node) error {
v, err := yaml.Marshal(value)
if err != nil {
return err
}
j, err := transcode.JSONFromYAML(v)
if err != nil {
return err
}
return json.Unmarshal(j, h)
}
func (h *Header) setLocation(loc Location) error {
if h == nil {
return nil
}
h.Location = loc
if err := h.Examples.setLocation(loc.AppendLocation("examples")); err != nil {
return err
}
if err := h.Schema.setLocation(loc.AppendLocation("schema")); err != nil {
return err
}
return nil
}
func (h *Header) isNil() bool { return h == nil }
func (*Header) refable() {}
var _ node = (*Header)(nil)
//
//
// func (h *Header) ResolveNodeByPointer(ptr jsonpointer.Pointer) (Node, error) {
// if err := ptr.Validate(); err != nil {
// return nil, err
// }
// return h.resolveNodeByPointer(ptr)
// }
// func (h *Header) resolveNodeByPointer(ptr jsonpointer.Pointer) (Node, error) {
// if ptr.IsRoot() {
// return h, nil
// }
// nxt, tok, _ := ptr.Next()
// switch nxt {
// case "schema":
// if h.Schema == nil {
// return nil, newErrNotFound(h.Location.AbsoluteLocation(), tok)
// }
// return h.Schema.resolveNodeByPointer(nxt)
// case "examples":
// if h.Examples == nil {
// return nil, newErrNotFound(h.Location.AbsoluteLocation(), tok)
// }
// return h.Examples.resolveNodeByPointer(nxt)
// default:
// return nil, newErrNotResolvable(h.Location.AbsoluteLocation(), tok)
// }
// }