Skip to content

Commit b520174

Browse files
committed
[Generator] Add support of deepObject style in query params
apple#259 ~Depends on apple/swift-openapi-runtime#100 landing first and getting released, and the version dependency being bumped here.~ Added `deepObject` style to serializer & parser in order to support nested keys on query parameters. Support nested keys on query parameters. Adapted snippet tests (SnippetBasedReferenceTests)
1 parent 1db77dd commit b520174

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

Sources/_OpenAPIGeneratorCore/Translator/CommonTypes/Constants.swift

+3
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,9 @@ enum Constants {
319319

320320
/// The form style.
321321
static let form = "form"
322+
323+
/// The deepObject style.
324+
static let deepObject = "deepObject"
322325
}
323326
}
324327

Sources/_OpenAPIGeneratorCore/Translator/Parameters/TypedParameter.swift

+5-1
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,10 @@ extension FileTranslator {
130130
let location = parameter.location
131131
switch location {
132132
case .query:
133-
guard case .form = style else {
133+
switch style {
134+
case .form, .deepObject:
135+
break
136+
default:
134137
try diagnostics.emitUnsupported(
135138
"Query params of style \(style.rawValue), explode: \(explode)",
136139
foundIn: foundIn
@@ -243,6 +246,7 @@ extension OpenAPI.Parameter.SchemaContext.Style {
243246
var runtimeName: String {
244247
switch self {
245248
case .form: return Constants.Components.Parameters.Style.form
249+
case .deepObject: return Constants.Components.Parameters.Style.deepObject
246250
default: preconditionFailure("Unsupported style")
247251
}
248252
}

Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift

+46-2
Original file line numberDiff line numberDiff line change
@@ -2539,6 +2539,18 @@ final class SnippetBasedReferenceTests: XCTestCase {
25392539
type: array
25402540
items:
25412541
type: string
2542+
- name: sort
2543+
in: query
2544+
required: true
2545+
style: deepObject
2546+
explode: true
2547+
schema:
2548+
type: object
2549+
properties:
2550+
option1:
2551+
type: string
2552+
option2:
2553+
type: string
25422554
responses:
25432555
default:
25442556
description: Response
@@ -2549,18 +2561,36 @@ final class SnippetBasedReferenceTests: XCTestCase {
25492561
public var single: Swift.String?
25502562
public var manyExploded: [Swift.String]?
25512563
public var manyUnexploded: [Swift.String]?
2564+
public struct sortPayload: Codable, Hashable, Sendable {
2565+
public var option1: Swift.String?
2566+
public var option2: Swift.String?
2567+
public init(
2568+
option1: Swift.String? = nil,
2569+
option2: Swift.String? = nil
2570+
) {
2571+
self.option1 = option1
2572+
self.option2 = option2
2573+
}
2574+
public enum CodingKeys: String, CodingKey {
2575+
case option1
2576+
case option2
2577+
}
2578+
}
2579+
public var sort: Operations.get_sol_foo.Input.Query.sortPayload
25522580
public init(
25532581
single: Swift.String? = nil,
25542582
manyExploded: [Swift.String]? = nil,
2555-
manyUnexploded: [Swift.String]? = nil
2583+
manyUnexploded: [Swift.String]? = nil,
2584+
sort: Operations.get_sol_foo.Input.Query.sortPayload
25562585
) {
25572586
self.single = single
25582587
self.manyExploded = manyExploded
25592588
self.manyUnexploded = manyUnexploded
2589+
self.sort = sort
25602590
}
25612591
}
25622592
public var query: Operations.get_sol_foo.Input.Query
2563-
public init(query: Operations.get_sol_foo.Input.Query = .init()) {
2593+
public init(query: Operations.get_sol_foo.Input.Query) {
25642594
self.query = query
25652595
}
25662596
}
@@ -2597,6 +2627,13 @@ final class SnippetBasedReferenceTests: XCTestCase {
25972627
name: "manyUnexploded",
25982628
value: input.query.manyUnexploded
25992629
)
2630+
try converter.setQueryItemAsURI(
2631+
in: &request,
2632+
style: .deepObject,
2633+
explode: true,
2634+
name: "sort",
2635+
value: input.query.sort
2636+
)
26002637
return (request, nil)
26012638
}
26022639
""",
@@ -2623,6 +2660,13 @@ final class SnippetBasedReferenceTests: XCTestCase {
26232660
explode: false,
26242661
name: "manyUnexploded",
26252662
as: [Swift.String].self
2663+
),
2664+
sort: try converter.getRequiredQueryItemAsURI(
2665+
in: request.soar_query,
2666+
style: .deepObject,
2667+
explode: true,
2668+
name: "sort",
2669+
as: Operations.get_sol_foo.Input.Query.sortPayload.self
26262670
)
26272671
)
26282672
return Operations.get_sol_foo.Input(query: query)

0 commit comments

Comments
 (0)