-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathComponentsRepresentable.swift
More file actions
205 lines (184 loc) · 7.62 KB
/
Copy pathComponentsRepresentable.swift
File metadata and controls
205 lines (184 loc) · 7.62 KB
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
//
// ComponentsRepresentable.swift
// feather-openapi
//
// Created by Tibor Bödecs on 2026. 01. 21.
//
import OpenAPIKit30
/// A type that can describe reusable OpenAPI components.
public protocol ComponentsRepresentable:
OpenAPIComponentsRepresentable,
VendorExtensionsProperty
{
/// Schema component map.
var schemas: OrderedDictionary<SchemaID, OpenAPISchemaRepresentable> { get }
/// Parameter component map.
var parameters:
OrderedDictionary<ParameterID, OpenAPIParameterRepresentable>
{ get }
/// Example component map.
var examples: OrderedDictionary<ExampleID, OpenAPIExampleRepresentable> {
get
}
/// Response component map.
var responses: OrderedDictionary<ResponseID, OpenAPIResponseRepresentable> {
get
}
/// Request body component map.
var requestBodies:
OrderedDictionary<RequestBodyID, OpenAPIRequestBodyRepresentable>
{ get }
/// Header component map.
var headers: OrderedDictionary<HeaderID, OpenAPIHeaderRepresentable> { get }
/// Security requirements used by the document.
var securityRequirements: [SecurityRequirementRepresentable] { get }
/// Link component map.
var links: OrderedDictionary<LinkID, OpenAPILinkRepresentable> { get }
// public var callbacks: OrderedDictionary<CallbackID, CallbackRepresentable>
/// Produces the OpenAPI schema components.
/// - Returns: A component dictionary of JSON schemas.
func openAPISchemas() -> OpenAPI.ComponentDictionary<JSONSchema>
/// Produces the OpenAPI parameter components.
/// - Returns: A component dictionary of parameters.
func openAPIParameters() -> OpenAPI.ComponentDictionary<OpenAPI.Parameter>
/// Produces the OpenAPI example components.
/// - Returns: A component dictionary of examples.
func openAPIExamples() -> OpenAPI.ComponentDictionary<OpenAPI.Example>
/// Produces the OpenAPI response components.
/// - Returns: A component dictionary of responses.
func openAPIResponses() -> OpenAPI.ComponentDictionary<OpenAPI.Response>
/// Produces the OpenAPI request body components.
/// - Returns: A component dictionary of requests.
func openAPIRequestBodies() -> OpenAPI.ComponentDictionary<OpenAPI.Request>
/// Produces the OpenAPI header components.
/// - Returns: A component dictionary of headers.
func openAPIHeaders() -> OpenAPI.ComponentDictionary<OpenAPI.Header>
/// Produces the OpenAPI security scheme components.
/// - Returns: A component dictionary of security schemes.
func openAPISecuritySchemes()
-> OpenAPI.ComponentDictionary<OpenAPI.SecurityScheme>
/// Produces the OpenAPI link components.
/// - Returns: A component dictionary of links.
func openAPILinks() -> OpenAPI.ComponentDictionary<OpenAPI.Link>
}
extension ComponentsRepresentable {
/// Default implementation for building schema components.
/// - Returns: A component dictionary of JSON schemas.
public func openAPISchemas() -> OpenAPI.ComponentDictionary<JSONSchema> {
var result: OpenAPI.ComponentDictionary<JSONSchema> = [:]
for (key, value) in schemas {
result[.init(stringLiteral: key.rawValue)] = value.openAPISchema()
}
return result
}
/// Default implementation for building parameter components.
/// - Returns: A component dictionary of parameters.
public func openAPIParameters()
-> OpenAPI.ComponentDictionary<OpenAPI.Parameter>
{
var result: OpenAPI.ComponentDictionary<OpenAPI.Parameter> = [:]
for (key, value) in parameters {
if let parameter = value.openAPIParameter().b {
result[.init(stringLiteral: key.rawValue)] = parameter
}
}
return result
}
/// Default implementation for building example components.
/// - Returns: A component dictionary of examples.
public func openAPIExamples()
-> OpenAPI.ComponentDictionary<OpenAPI.Example>
{
var result: OpenAPI.ComponentDictionary<OpenAPI.Example> = [:]
for (key, value) in examples {
if let example = value.openAPIExample().b {
result[.init(stringLiteral: key.rawValue)] = example
}
}
return result
}
/// Default implementation for building response components.
/// - Returns: A component dictionary of responses.
public func openAPIResponses()
-> OpenAPI.ComponentDictionary<OpenAPI.Response>
{
var result: OpenAPI.ComponentDictionary<OpenAPI.Response> = [:]
for (key, value) in responses {
if let response = value.openAPIResponse().b {
result[.init(stringLiteral: key.rawValue)] = response
}
}
return result
}
/// Default implementation for building request body components.
/// - Returns: A component dictionary of requests.
public func openAPIRequestBodies()
-> OpenAPI.ComponentDictionary<OpenAPI.Request>
{
var result: OpenAPI.ComponentDictionary<OpenAPI.Request> = [:]
for (key, value) in requestBodies {
if let requestBody = value.openAPIRequestBody().b {
result[.init(stringLiteral: key.rawValue)] = requestBody
}
}
return result
}
/// Default implementation for building header components.
/// - Returns: A component dictionary of headers.
public func openAPIHeaders() -> OpenAPI.ComponentDictionary<OpenAPI.Header>
{
var result: OpenAPI.ComponentDictionary<OpenAPI.Header> = [:]
for (key, value) in headers {
if let header = value.openAPIHeader().b {
result[.init(stringLiteral: key.rawValue)] = header
}
}
return result
}
/// Default implementation for building security scheme components.
/// - Returns: A component dictionary of security schemes.
public func openAPISecuritySchemes()
-> OpenAPI.ComponentDictionary<OpenAPI.SecurityScheme>
{
var result: OpenAPI.ComponentDictionary<OpenAPI.SecurityScheme> = [:]
for requirement in securityRequirements {
let scheme = requirement.security
result[.init(stringLiteral: scheme.openAPIIdentifier)] =
scheme.openAPISecurityScheme()
}
return result
}
/// Default implementation for building link components.
/// - Returns: A component dictionary of links.
public func openAPILinks() -> OpenAPI.ComponentDictionary<OpenAPI.Link> {
var result: OpenAPI.ComponentDictionary<OpenAPI.Link> = [:]
for (key, value) in links {
result[.init(stringLiteral: key.rawValue)] = value.openAPILink()
}
return result
}
// func openAPICallbacks() -> OpenAPI.ComponentDictionary<Callback> {
// var result: OpenAPI.ComponentDictionary<Callback> = [:]
//
// for (key, value) in callbacks {
// result[.init(stringLiteral: key.rawValue)] = value.openAPICallback()
// }
// return result
// }
/// Builds an OpenAPI components object.
/// - Returns: The OpenAPI components.
public func openAPIComponents() -> OpenAPI.Components {
.init(
schemas: openAPISchemas(),
responses: openAPIResponses(),
parameters: openAPIParameters(),
examples: openAPIExamples(),
requestBodies: openAPIRequestBodies(),
headers: openAPIHeaders(),
securitySchemes: openAPISecuritySchemes(),
links: openAPILinks(),
callbacks: .init(),
vendorExtensions: vendorExtensions
)
}
}