Skip to content

Commit a0b2d91

Browse files
committed
Add OAS 3.2.0 defaultMapping field to Discriminator Object
1 parent 635f0a1 commit a0b2d91

File tree

2 files changed

+76
-2
lines changed

2 files changed

+76
-2
lines changed

Sources/OpenAPIKit/Discriminator.swift

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,44 @@ extension OpenAPI {
1111
/// OpenAPI Spec "Discriminator Object"
1212
///
1313
/// See [OpenAPI Discriminator Object](https://spec.openapis.org/oas/v3.2.0.html#discriminator-object).
14-
public struct Discriminator: Equatable, Sendable {
14+
public struct Discriminator: HasConditionalWarnings, Sendable {
1515
public let propertyName: String
1616
public let mapping: OrderedDictionary<String, String>?
17+
public let defaultMapping: String?
18+
19+
public let conditionalWarnings: [(any Condition, OpenAPI.Warning)]
1720

1821
public init(propertyName: String,
19-
mapping: OrderedDictionary<String, String>? = nil) {
22+
mapping: OrderedDictionary<String, String>? = nil,
23+
defaultMapping: String? = nil) {
2024
self.propertyName = propertyName
2125
self.mapping = mapping
26+
self.defaultMapping = defaultMapping
27+
28+
self.conditionalWarnings = [
29+
nonNilVersionWarning(fieldName: "defaultMapping", value: defaultMapping, minimumVersion: .v3_2_0)
30+
].compactMap { $0 }
2231
}
2332
}
2433
}
2534

35+
extension OpenAPI.Discriminator: Equatable {
36+
public static func == (lhs: Self, rhs: Self) -> Bool {
37+
lhs.propertyName == rhs.propertyName
38+
&& lhs.mapping == rhs.mapping
39+
&& lhs.defaultMapping == rhs.defaultMapping
40+
}
41+
}
42+
43+
fileprivate func nonNilVersionWarning<Subject>(fieldName: String, value: Subject?, minimumVersion: OpenAPI.Document.Version) -> (any Condition, OpenAPI.Warning)? {
44+
value.map { _ in
45+
OpenAPI.Document.ConditionalWarnings.version(
46+
lessThan: minimumVersion,
47+
doesNotSupport: "The Discriminator \(fieldName) field"
48+
)
49+
}
50+
}
51+
2652
// MARK: - Codable
2753

2854
extension OpenAPI.Discriminator: Encodable {
@@ -31,6 +57,7 @@ extension OpenAPI.Discriminator: Encodable {
3157

3258
try container.encode(propertyName, forKey: .propertyName)
3359
try container.encodeIfPresent(mapping, forKey: .mapping)
60+
try container.encodeIfPresent(defaultMapping, forKey: .defaultMapping)
3461
}
3562
}
3663

@@ -40,13 +67,19 @@ extension OpenAPI.Discriminator: Decodable {
4067

4168
propertyName = try container.decode(String.self, forKey: .propertyName)
4269
mapping = try container.decodeIfPresent(OrderedDictionary<String, String>.self, forKey: .mapping)
70+
defaultMapping = try container.decodeIfPresent(String.self, forKey: .defaultMapping)
71+
72+
conditionalWarnings = [
73+
nonNilVersionWarning(fieldName: "defaultMapping", value: defaultMapping, minimumVersion: .v3_2_0)
74+
].compactMap { $0 }
4375
}
4476
}
4577

4678
extension OpenAPI.Discriminator {
4779
private enum CodingKeys: String, CodingKey {
4880
case propertyName
4981
case mapping
82+
case defaultMapping
5083
}
5184
}
5285

Tests/OpenAPIKitTests/DiscriminatorTests.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,21 @@ final class DiscriminatorTests: XCTestCase {
1414
let t1 = OpenAPI.Discriminator(propertyName: "hello world")
1515
XCTAssertEqual(t1.propertyName, "hello world")
1616
XCTAssertNil(t1.mapping)
17+
XCTAssertEqual(t1.conditionalWarnings.count, 0)
1718

1819
let t2 = OpenAPI.Discriminator(propertyName: "hello world",
1920
mapping: ["hello": "world"])
2021
XCTAssertEqual(t2.propertyName, "hello world")
2122
XCTAssertEqual(t2.mapping, ["hello": "world"])
23+
XCTAssertEqual(t2.conditionalWarnings.count, 0)
24+
25+
let t3 = OpenAPI.Discriminator(propertyName: "hello world",
26+
mapping: ["hello": "world"],
27+
defaultMapping: "world")
28+
XCTAssertEqual(t3.propertyName, "hello world")
29+
XCTAssertEqual(t3.mapping, ["hello": "world"])
30+
XCTAssertEqual(t3.defaultMapping, "world")
31+
XCTAssertEqual(t3.conditionalWarnings.count, 1)
2232
}
2333
}
2434

@@ -85,4 +95,35 @@ extension DiscriminatorTests {
8595
XCTAssertEqual(discriminator, OpenAPI.Discriminator(propertyName: "hello",
8696
mapping: [ "hello": "world"]))
8797
}
98+
99+
func test_withDefaultMapping_encode() {
100+
let discriminator = OpenAPI.Discriminator(propertyName: "hello",
101+
defaultMapping: "world")
102+
let encodedDiscriminator = try! orderUnstableTestStringFromEncoding(of: discriminator)
103+
104+
assertJSONEquivalent(
105+
encodedDiscriminator,
106+
"""
107+
{
108+
"defaultMapping" : "world",
109+
"propertyName" : "hello"
110+
}
111+
"""
112+
)
113+
}
114+
115+
func test_withDefaultMapping_decode() {
116+
let discriminatorData =
117+
"""
118+
{
119+
"defaultMapping" : "world",
120+
"propertyName": "hello",
121+
}
122+
""".data(using: .utf8)!
123+
124+
let discriminator = try! orderUnstableDecode(OpenAPI.Discriminator.self, from: discriminatorData)
125+
126+
XCTAssertEqual(discriminator, OpenAPI.Discriminator(propertyName: "hello",
127+
defaultMapping: "world"))
128+
}
88129
}

0 commit comments

Comments
 (0)