Skip to content

Commit 82556e6

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

File tree

3 files changed

+54
-4
lines changed

3 files changed

+54
-4
lines changed

Sources/_OpenAPIGeneratorCore/Translator/CommonTypes/Constants.swift

+3
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,9 @@ enum Constants {
296296

297297
/// The form style.
298298
static let form = "form"
299+
300+
/// The deepObject style.
301+
static let deepObject = "deepObject"
299302
}
300303
}
301304

Sources/_OpenAPIGeneratorCore/Translator/Parameters/TypedParameter.swift

+5-2
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,14 @@ extension FileTranslator {
139139
let location = parameter.location
140140
switch location {
141141
case .query:
142-
guard case .form = style else {
142+
switch style {
143+
case .form, .deepObject:
144+
break
145+
default:
143146
diagnostics.emitUnsupported(
144147
"Query params of style \(style.rawValue), explode: \(explode)",
145148
foundIn: foundIn
146149
)
147-
return nil
148150
}
149151
case .header, .path:
150152
guard case .simple = style else {
@@ -252,6 +254,7 @@ extension OpenAPI.Parameter.SchemaContext.Style {
252254
var runtimeName: String {
253255
switch self {
254256
case .form: return Constants.Components.Parameters.Style.form
257+
case .deepObject: return Constants.Components.Parameters.Style.deepObject
255258
default: preconditionFailure("Unsupported style")
256259
}
257260
}

Tests/OpenAPIGeneratorReferenceTests/SnippetBasedReferenceTests.swift

+46-2
Original file line numberDiff line numberDiff line change
@@ -2404,6 +2404,18 @@ final class SnippetBasedReferenceTests: XCTestCase {
24042404
type: array
24052405
items:
24062406
type: string
2407+
- name: sort
2408+
in: query
2409+
required: true
2410+
style: deepObject
2411+
explode: true
2412+
schema:
2413+
type: object
2414+
properties:
2415+
option1:
2416+
type: string
2417+
option2:
2418+
type: string
24072419
responses:
24082420
default:
24092421
description: Response
@@ -2414,18 +2426,36 @@ final class SnippetBasedReferenceTests: XCTestCase {
24142426
public var single: Swift.String?
24152427
public var manyExploded: [Swift.String]?
24162428
public var manyUnexploded: [Swift.String]?
2429+
public struct sortPayload: Codable, Hashable, Sendable {
2430+
public var option1: Swift.String?
2431+
public var option2: Swift.String?
2432+
public init(
2433+
option1: Swift.String? = nil,
2434+
option2: Swift.String? = nil
2435+
) {
2436+
self.option1 = option1
2437+
self.option2 = option2
2438+
}
2439+
public enum CodingKeys: String, CodingKey {
2440+
case option1
2441+
case option2
2442+
}
2443+
}
2444+
public var sort: Operations.get_sol_foo.Input.Query.sortPayload
24172445
public init(
24182446
single: Swift.String? = nil,
24192447
manyExploded: [Swift.String]? = nil,
2420-
manyUnexploded: [Swift.String]? = nil
2448+
manyUnexploded: [Swift.String]? = nil,
2449+
sort: Operations.get_sol_foo.Input.Query.sortPayload
24212450
) {
24222451
self.single = single
24232452
self.manyExploded = manyExploded
24242453
self.manyUnexploded = manyUnexploded
2454+
self.sort = sort
24252455
}
24262456
}
24272457
public var query: Operations.get_sol_foo.Input.Query
2428-
public init(query: Operations.get_sol_foo.Input.Query = .init()) {
2458+
public init(query: Operations.get_sol_foo.Input.Query) {
24292459
self.query = query
24302460
}
24312461
}
@@ -2462,6 +2492,13 @@ final class SnippetBasedReferenceTests: XCTestCase {
24622492
name: "manyUnexploded",
24632493
value: input.query.manyUnexploded
24642494
)
2495+
try converter.setQueryItemAsURI(
2496+
in: &request,
2497+
style: .deepObject,
2498+
explode: true,
2499+
name: "sort",
2500+
value: input.query.sort
2501+
)
24652502
return (request, nil)
24662503
}
24672504
""",
@@ -2488,6 +2525,13 @@ final class SnippetBasedReferenceTests: XCTestCase {
24882525
explode: false,
24892526
name: "manyUnexploded",
24902527
as: [Swift.String].self
2528+
),
2529+
sort: try converter.getRequiredQueryItemAsURI(
2530+
in: request.soar_query,
2531+
style: .deepObject,
2532+
explode: true,
2533+
name: "sort",
2534+
as: Operations.get_sol_foo.Input.Query.sortPayload.self
24912535
)
24922536
)
24932537
return Operations.get_sol_foo.Input(query: query)

0 commit comments

Comments
 (0)