Skip to content

Commit d092c12

Browse files
committed
Add new HTTP QUERY method support
1 parent 15e8949 commit d092c12

File tree

14 files changed

+177
-35
lines changed

14 files changed

+177
-35
lines changed

Sources/OpenAPIKit/Either/Either+Convenience.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ extension Either where B == OpenAPI.PathItem {
169169
head: OpenAPI.Operation? = nil,
170170
patch: OpenAPI.Operation? = nil,
171171
trace: OpenAPI.Operation? = nil,
172+
query: OpenAPI.Operation? = nil,
172173
vendorExtensions: [String: AnyCodable] = [:]
173174
) {
174175
self = .b(
@@ -185,6 +186,7 @@ extension Either where B == OpenAPI.PathItem {
185186
head: head,
186187
patch: patch,
187188
trace: trace,
189+
query: query,
188190
vendorExtensions: vendorExtensions
189191
)
190192
)

Sources/OpenAPIKit/Path Item/DereferencedPathItem.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ public struct DereferencedPathItem: Equatable {
3434
public let patch: DereferencedOperation?
3535
/// The dereferenced TRACE operation, if defined.
3636
public let trace: DereferencedOperation?
37+
/// The dereferenced QUERY operation, if defined.
38+
public let query: DereferencedOperation?
3739

3840
public subscript<T>(dynamicMember path: KeyPath<OpenAPI.PathItem, T>) -> T {
3941
return underlyingPathItem[keyPath: path]
@@ -64,6 +66,7 @@ public struct DereferencedPathItem: Equatable {
6466
self.head = try pathItem.head.map { try DereferencedOperation($0, resolvingIn: components, following: references) }
6567
self.patch = try pathItem.patch.map { try DereferencedOperation($0, resolvingIn: components, following: references) }
6668
self.trace = try pathItem.trace.map { try DereferencedOperation($0, resolvingIn: components, following: references) }
69+
self.query = try pathItem.query.map { try DereferencedOperation($0, resolvingIn: components, following: references) }
6770

6871
var pathItem = pathItem
6972
if let name {
@@ -96,6 +99,8 @@ extension DereferencedPathItem {
9699
return self.put
97100
case .trace:
98101
return self.trace
102+
case .query:
103+
return self.query
99104
}
100105
}
101106

@@ -151,6 +156,7 @@ extension OpenAPI.PathItem: ExternallyDereferenceable {
151156
let oldHead = head
152157
let oldPatch = patch
153158
let oldTrace = trace
159+
let oldQuery = query
154160

155161
async let (newParameters, c1, m1) = oldParameters.externallyDereferenced(with: loader)
156162
// async let (newServers, c2, m2) = oldServers.externallyDereferenced(with: loader)
@@ -162,6 +168,7 @@ extension OpenAPI.PathItem: ExternallyDereferenceable {
162168
async let (newHead, c8, m8) = oldHead.externallyDereferenced(with: loader)
163169
async let (newPatch, c9, m9) = oldPatch.externallyDereferenced(with: loader)
164170
async let (newTrace, c10, m10) = oldTrace.externallyDereferenced(with: loader)
171+
async let (newQuery, c11, m11) = oldQuery.externallyDereferenced(with: loader)
165172

166173
var pathItem = self
167174
var newComponents = try await c1
@@ -179,6 +186,7 @@ extension OpenAPI.PathItem: ExternallyDereferenceable {
179186
pathItem.head = try await newHead
180187
pathItem.patch = try await newPatch
181188
pathItem.trace = try await newTrace
189+
pathItem.query = try await newQuery
182190

183191
try await newComponents.merge(c3)
184192
try await newComponents.merge(c4)
@@ -188,6 +196,7 @@ extension OpenAPI.PathItem: ExternallyDereferenceable {
188196
try await newComponents.merge(c8)
189197
try await newComponents.merge(c9)
190198
try await newComponents.merge(c10)
199+
try await newComponents.merge(c11)
191200

192201
try await newMessages += m3
193202
try await newMessages += m4
@@ -197,6 +206,7 @@ extension OpenAPI.PathItem: ExternallyDereferenceable {
197206
try await newMessages += m8
198207
try await newMessages += m9
199208
try await newMessages += m10
209+
try await newMessages += m11
200210

201211
if let oldServers {
202212
async let (newServers, c2, m2) = oldServers.externallyDereferenced(with: loader)

Sources/OpenAPIKit/Path Item/PathItem.swift

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import OpenAPIKitCore
99

1010
extension OpenAPI {
11-
/// OpenAPI Spec "Path Item Object"
11+
/// OpenAPI Spec "Path Item Object" (although in the spec the Path Item
12+
/// Object also includes reference support which OpenAPIKit implements via
13+
/// the PathItem.Map type)
1214
///
1315
/// See [OpenAPI Path Item Object](https://spec.openapis.org/oas/v3.1.1.html#path-item-object).
1416
///
@@ -52,6 +54,8 @@ extension OpenAPI {
5254
public var patch: Operation?
5355
/// The `TRACE` endpoint at this path, if one exists.
5456
public var trace: Operation?
57+
/// The `QUERY` endpoint at this path, if one exists.
58+
public var query: Operation?
5559

5660
/// Dictionary of vendor extensions.
5761
///
@@ -73,6 +77,7 @@ extension OpenAPI {
7377
head: Operation? = nil,
7478
patch: Operation? = nil,
7579
trace: Operation? = nil,
80+
query: Operation? = nil,
7681
vendorExtensions: [String: AnyCodable] = [:]
7782
) {
7883
self.summary = summary
@@ -88,6 +93,7 @@ extension OpenAPI {
8893
self.head = head
8994
self.patch = patch
9095
self.trace = trace
96+
self.query = query
9197
self.vendorExtensions = vendorExtensions
9298
}
9399

@@ -130,6 +136,11 @@ extension OpenAPI {
130136
public mutating func trace(_ op: Operation?) {
131137
trace = op
132138
}
139+
140+
/// Set the `QUERY` endpoint operation.
141+
public mutating func query(_ op: Operation?) {
142+
query = op
143+
}
133144
}
134145
}
135146

@@ -164,6 +175,8 @@ extension OpenAPI.PathItem {
164175
return self.put
165176
case .trace:
166177
return self.trace
178+
case .query:
179+
return self.query
167180
}
168181
}
169182

@@ -186,6 +199,8 @@ extension OpenAPI.PathItem {
186199
self.put(operation)
187200
case .trace:
188201
self.trace(operation)
202+
case .query:
203+
self.query(operation)
189204
}
190205
}
191206

@@ -256,6 +271,7 @@ extension OpenAPI.PathItem: Encodable {
256271
try container.encodeIfPresent(head, forKey: .head)
257272
try container.encodeIfPresent(patch, forKey: .patch)
258273
try container.encodeIfPresent(trace, forKey: .trace)
274+
try container.encodeIfPresent(query, forKey: .query)
259275

260276
if VendorExtensionsConfiguration.isEnabled(for: encoder) {
261277
try encodeExtensions(to: &container)
@@ -281,6 +297,7 @@ extension OpenAPI.PathItem: Decodable {
281297
head = try container.decodeIfPresent(OpenAPI.Operation.self, forKey: .head)
282298
patch = try container.decodeIfPresent(OpenAPI.Operation.self, forKey: .patch)
283299
trace = try container.decodeIfPresent(OpenAPI.Operation.self, forKey: .trace)
300+
query = try container.decodeIfPresent(OpenAPI.Operation.self, forKey: .query)
284301

285302
vendorExtensions = try Self.extensions(from: decoder)
286303
} catch let error as DecodingError {
@@ -314,6 +331,7 @@ extension OpenAPI.PathItem {
314331
case head
315332
case patch
316333
case trace
334+
case query
317335

318336
case extended(String)
319337

@@ -331,7 +349,8 @@ extension OpenAPI.PathItem {
331349
.options,
332350
.head,
333351
.patch,
334-
.trace
352+
.trace,
353+
.query
335354
]
336355
}
337356

@@ -365,6 +384,8 @@ extension OpenAPI.PathItem {
365384
self = .patch
366385
case "trace":
367386
self = .trace
387+
case "query":
388+
self = .query
368389
default:
369390
self = .extendedKey(for: stringValue)
370391
}
@@ -396,6 +417,8 @@ extension OpenAPI.PathItem {
396417
return "patch"
397418
case .trace:
398419
return "trace"
420+
case .query:
421+
return "query"
399422
case .extended(let key):
400423
return key
401424
}

Sources/OpenAPIKit/Path Item/ResolvedRoute.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ public struct ResolvedRoute: Equatable {
6464
public let patch: ResolvedEndpoint?
6565
/// The HTTP `TRACE` endpoint at this route.
6666
public let trace: ResolvedEndpoint?
67+
/// The HTTP `QUERY` endpoint at this route.
68+
public let query: ResolvedEndpoint?
6769

6870
/// Create a ResolvedRoute.
6971
///
@@ -103,6 +105,7 @@ public struct ResolvedRoute: Equatable {
103105
self.head = endpoints[.head]
104106
self.patch = endpoints[.patch]
105107
self.trace = endpoints[.trace]
108+
self.query = endpoints[.query]
106109
}
107110

108111
/// An array of all endpoints at this route.
@@ -115,7 +118,8 @@ public struct ResolvedRoute: Equatable {
115118
self.options,
116119
self.head,
117120
self.patch,
118-
self.trace
121+
self.trace,
122+
self.query
119123
].compactMap { $0 }
120124
}
121125

@@ -138,6 +142,8 @@ public struct ResolvedRoute: Equatable {
138142
return self.put
139143
case .trace:
140144
return self.trace
145+
case .query:
146+
return self.query
141147
}
142148
}
143149

Sources/OpenAPIKit30/Path Item/DereferencedPathItem.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ extension DereferencedPathItem {
9595
return self.put
9696
case .trace:
9797
return self.trace
98+
case .query:
99+
return nil
98100
}
99101
}
100102

Sources/OpenAPIKit30/Path Item/PathItem.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,8 @@ extension OpenAPI.PathItem {
164164
return self.put
165165
case .trace:
166166
return self.trace
167+
case .query:
168+
return nil
167169
}
168170
}
169171

@@ -186,6 +188,9 @@ extension OpenAPI.PathItem {
186188
self.put(operation)
187189
case .trace:
188190
self.trace(operation)
191+
case .query:
192+
// not representable
193+
print("The QUERY operation was not directly representable in the OAS standard until version 3.2.0")
189194
}
190195
}
191196

Sources/OpenAPIKit30/Path Item/ResolvedRoute.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ public struct ResolvedRoute: Equatable {
138138
return self.put
139139
case .trace:
140140
return self.trace
141+
case .query:
142+
return nil
141143
}
142144
}
143145

Sources/OpenAPIKitCore/Shared/HttpMethod.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,6 @@ extension Shared {
2121
case head = "HEAD"
2222
case options = "OPTIONS"
2323
case trace = "TRACE"
24+
case query = "QUERY"
2425
}
2526
}

Tests/OpenAPIKitTests/ComponentsTests.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -581,7 +581,8 @@ extension ComponentsTests {
581581
options: op,
582582
head: op,
583583
patch: op,
584-
trace: op
584+
trace: op,
585+
query: op
585586
)
586587
]
587588
)
@@ -614,6 +615,9 @@ extension ComponentsTests {
614615
},
615616
"put" : {
616617
618+
},
619+
"query" : {
620+
617621
},
618622
"trace" : {
619623
@@ -646,6 +650,8 @@ extension ComponentsTests {
646650
"put" : {
647651
},
648652
"trace" : {
653+
},
654+
"query" : {
649655
}
650656
}
651657
}
@@ -667,7 +673,8 @@ extension ComponentsTests {
667673
options: op,
668674
head: op,
669675
patch: op,
670-
trace: op
676+
trace: op,
677+
query: op
671678
)
672679
]
673680
)

0 commit comments

Comments
 (0)