Skip to content

Commit 4299f1e

Browse files
committed
[Generator] Add support of deepObject style in query params
#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 3f881d6 commit 4299f1e

File tree

3 files changed

+54
-3
lines changed

3 files changed

+54
-3
lines changed

Sources/_OpenAPIGeneratorCore/Translator/CommonTypes/Constants.swift

Lines changed: 3 additions & 0 deletions
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

Lines changed: 5 additions & 1 deletion
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

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2600,6 +2600,18 @@ final class SnippetBasedReferenceTests: XCTestCase {
26002600
type: array
26012601
items:
26022602
type: string
2603+
- name: sort
2604+
in: query
2605+
required: true
2606+
style: deepObject
2607+
explode: true
2608+
schema:
2609+
type: object
2610+
properties:
2611+
option1:
2612+
type: string
2613+
option2:
2614+
type: string
26032615
responses:
26042616
default:
26052617
description: Response
@@ -2610,18 +2622,36 @@ final class SnippetBasedReferenceTests: XCTestCase {
26102622
public var single: Swift.String?
26112623
public var manyExploded: [Swift.String]?
26122624
public var manyUnexploded: [Swift.String]?
2625+
public struct sortPayload: Codable, Hashable, Sendable {
2626+
public var option1: Swift.String?
2627+
public var option2: Swift.String?
2628+
public init(
2629+
option1: Swift.String? = nil,
2630+
option2: Swift.String? = nil
2631+
) {
2632+
self.option1 = option1
2633+
self.option2 = option2
2634+
}
2635+
public enum CodingKeys: String, CodingKey {
2636+
case option1
2637+
case option2
2638+
}
2639+
}
2640+
public var sort: Operations.get_sol_foo.Input.Query.sortPayload
26132641
public init(
26142642
single: Swift.String? = nil,
26152643
manyExploded: [Swift.String]? = nil,
2616-
manyUnexploded: [Swift.String]? = nil
2644+
manyUnexploded: [Swift.String]? = nil,
2645+
sort: Operations.get_sol_foo.Input.Query.sortPayload
26172646
) {
26182647
self.single = single
26192648
self.manyExploded = manyExploded
26202649
self.manyUnexploded = manyUnexploded
2650+
self.sort = sort
26212651
}
26222652
}
26232653
public var query: Operations.get_sol_foo.Input.Query
2624-
public init(query: Operations.get_sol_foo.Input.Query = .init()) {
2654+
public init(query: Operations.get_sol_foo.Input.Query) {
26252655
self.query = query
26262656
}
26272657
}
@@ -2658,6 +2688,13 @@ final class SnippetBasedReferenceTests: XCTestCase {
26582688
name: "manyUnexploded",
26592689
value: input.query.manyUnexploded
26602690
)
2691+
try converter.setQueryItemAsURI(
2692+
in: &request,
2693+
style: .deepObject,
2694+
explode: true,
2695+
name: "sort",
2696+
value: input.query.sort
2697+
)
26612698
return (request, nil)
26622699
}
26632700
""",
@@ -2684,6 +2721,13 @@ final class SnippetBasedReferenceTests: XCTestCase {
26842721
explode: false,
26852722
name: "manyUnexploded",
26862723
as: [Swift.String].self
2724+
),
2725+
sort: try converter.getRequiredQueryItemAsURI(
2726+
in: request.soar_query,
2727+
style: .deepObject,
2728+
explode: true,
2729+
name: "sort",
2730+
as: Operations.get_sol_foo.Input.Query.sortPayload.self
26872731
)
26882732
)
26892733
return Operations.get_sol_foo.Input(query: query)

0 commit comments

Comments
 (0)