Skip to content

Commit ea46a4c

Browse files
authored
Merge pull request #376 from mattpolzin/defs
Add JSON Schema `$defs` encoding & decoding
2 parents 104d9e0 + 3070c0e commit ea46a4c

File tree

3 files changed

+249
-46
lines changed

3 files changed

+249
-46
lines changed

Sources/OpenAPIKit/Schema Object/JSONSchema.swift

+99-34
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,38 @@ public struct JSONSchema: JSONSchemaContext, HasWarnings {
237237

238238
}
239239

240+
// See `JSONSchemaContext`
241+
public var defs: OrderedDictionary<String, JSONSchema> {
242+
switch value {
243+
case .null(let core):
244+
return core.defs
245+
case .boolean(let core):
246+
return core.defs
247+
case .number(let core, _):
248+
return core.defs
249+
case .integer(let core, _):
250+
return core.defs
251+
case .string(let core, _):
252+
return core.defs
253+
case .object(let core, _):
254+
return core.defs
255+
case .array(let core, _):
256+
return core.defs
257+
case .all(of: _, core: let core):
258+
return core.defs
259+
case .one(of: _, core: let core):
260+
return core.defs
261+
case .any(of: _, core: let core):
262+
return core.defs
263+
case .not(_, core: let core):
264+
return core.defs
265+
case .reference(_, let core):
266+
return core.defs
267+
case .fragment(let core):
268+
return core.defs
269+
}
270+
}
271+
240272
// See `JSONSchemaContext`
241273
public var inferred: Bool {
242274
return coreContext.inferred
@@ -1086,7 +1118,8 @@ extension JSONSchema {
10861118
defaultValue: AnyCodable? = nil,
10871119
examples: [AnyCodable] = [],
10881120
anchor: String? = nil,
1089-
dynamicAnchor: String? = nil
1121+
dynamicAnchor: String? = nil,
1122+
defs: OrderedDictionary<String, JSONSchema> = [:]
10901123
) -> JSONSchema {
10911124
let context = JSONSchema.CoreContext<JSONTypeFormat.BooleanFormat>(
10921125
format: format,
@@ -1102,7 +1135,8 @@ extension JSONSchema {
11021135
defaultValue: defaultValue,
11031136
examples: examples,
11041137
anchor: anchor,
1105-
dynamicAnchor: dynamicAnchor
1138+
dynamicAnchor: dynamicAnchor,
1139+
defs: defs
11061140
)
11071141
return .boolean(context)
11081142
}
@@ -1123,7 +1157,8 @@ extension JSONSchema {
11231157
defaultValue: AnyCodable? = nil,
11241158
examples: [AnyCodable] = [],
11251159
anchor: String? = nil,
1126-
dynamicAnchor: String? = nil
1160+
dynamicAnchor: String? = nil,
1161+
defs: OrderedDictionary<String, JSONSchema> = [:]
11271162
) -> JSONSchema {
11281163
return .boolean(
11291164
format: format,
@@ -1139,7 +1174,8 @@ extension JSONSchema {
11391174
defaultValue: defaultValue,
11401175
examples: examples,
11411176
anchor: anchor,
1142-
dynamicAnchor: dynamicAnchor
1177+
dynamicAnchor: dynamicAnchor,
1178+
defs: defs
11431179
)
11441180
}
11451181

@@ -1164,7 +1200,8 @@ extension JSONSchema {
11641200
defaultValue: AnyCodable? = nil,
11651201
examples: [AnyCodable] = [],
11661202
anchor: String? = nil,
1167-
dynamicAnchor: String? = nil
1203+
dynamicAnchor: String? = nil,
1204+
defs: OrderedDictionary<String, JSONSchema> = [:]
11681205
) -> JSONSchema {
11691206
let context = JSONSchema.CoreContext<JSONTypeFormat.AnyFormat>(
11701207
format: format,
@@ -1180,7 +1217,8 @@ extension JSONSchema {
11801217
defaultValue: defaultValue,
11811218
examples: examples,
11821219
anchor: anchor,
1183-
dynamicAnchor: dynamicAnchor
1220+
dynamicAnchor: dynamicAnchor,
1221+
defs: defs
11841222
)
11851223
return .fragment(context)
11861224
}
@@ -1201,7 +1239,8 @@ extension JSONSchema {
12011239
defaultValue: AnyCodable? = nil,
12021240
examples: [AnyCodable] = [],
12031241
anchor: String? = nil,
1204-
dynamicAnchor: String? = nil
1242+
dynamicAnchor: String? = nil,
1243+
defs: OrderedDictionary<String, JSONSchema> = [:]
12051244
) -> JSONSchema {
12061245
return .fragment(
12071246
format: format,
@@ -1217,7 +1256,8 @@ extension JSONSchema {
12171256
defaultValue: defaultValue,
12181257
examples: examples,
12191258
anchor: anchor,
1220-
dynamicAnchor: dynamicAnchor
1259+
dynamicAnchor: dynamicAnchor,
1260+
defs: defs
12211261
)
12221262
}
12231263

@@ -1250,7 +1290,8 @@ extension JSONSchema {
12501290
defaultValue: AnyCodable? = nil,
12511291
examples: [AnyCodable] = [],
12521292
anchor: String? = nil,
1253-
dynamicAnchor: String? = nil
1293+
dynamicAnchor: String? = nil,
1294+
defs: OrderedDictionary<String, JSONSchema> = [:]
12541295
) -> JSONSchema {
12551296
let genericContext = JSONSchema.CoreContext<JSONTypeFormat.StringFormat>(
12561297
format: format,
@@ -1266,7 +1307,8 @@ extension JSONSchema {
12661307
defaultValue: defaultValue,
12671308
examples: examples,
12681309
anchor: anchor,
1269-
dynamicAnchor: dynamicAnchor
1310+
dynamicAnchor: dynamicAnchor,
1311+
defs: defs
12701312
)
12711313
let stringContext = JSONSchema.StringContext(
12721314
maxLength: maxLength,
@@ -1299,7 +1341,8 @@ extension JSONSchema {
12991341
defaultValue: AnyCodable? = nil,
13001342
examples: [AnyCodable] = [],
13011343
anchor: String? = nil,
1302-
dynamicAnchor: String? = nil
1344+
dynamicAnchor: String? = nil,
1345+
defs: OrderedDictionary<String, JSONSchema> = [:]
13031346
) -> JSONSchema {
13041347
return .string(
13051348
format: format,
@@ -1320,7 +1363,8 @@ extension JSONSchema {
13201363
defaultValue: defaultValue,
13211364
examples: examples,
13221365
anchor: anchor,
1323-
dynamicAnchor: dynamicAnchor
1366+
dynamicAnchor: dynamicAnchor,
1367+
defs: defs
13241368
)
13251369
}
13261370

@@ -1348,7 +1392,8 @@ extension JSONSchema {
13481392
defaultValue: AnyCodable? = nil,
13491393
examples: [AnyCodable] = [],
13501394
anchor: String? = nil,
1351-
dynamicAnchor: String? = nil
1395+
dynamicAnchor: String? = nil,
1396+
defs: OrderedDictionary<String, JSONSchema> = [:]
13521397
) -> JSONSchema {
13531398
let genericContext = JSONSchema.CoreContext<JSONTypeFormat.NumberFormat>(
13541399
format: format,
@@ -1364,7 +1409,8 @@ extension JSONSchema {
13641409
defaultValue: defaultValue,
13651410
examples: examples,
13661411
anchor: anchor,
1367-
dynamicAnchor: dynamicAnchor
1412+
dynamicAnchor: dynamicAnchor,
1413+
defs: defs
13681414
)
13691415
let numbericContext = JSONSchema.NumericContext(
13701416
multipleOf: multipleOf,
@@ -1393,7 +1439,8 @@ extension JSONSchema {
13931439
defaultValue: AnyCodable? = nil,
13941440
examples: [AnyCodable] = [],
13951441
anchor: String? = nil,
1396-
dynamicAnchor: String? = nil
1442+
dynamicAnchor: String? = nil,
1443+
defs: OrderedDictionary<String, JSONSchema> = [:]
13971444
) -> JSONSchema {
13981445
return .number(
13991446
format: format,
@@ -1412,7 +1459,8 @@ extension JSONSchema {
14121459
defaultValue: defaultValue,
14131460
examples: examples,
14141461
anchor: anchor,
1415-
dynamicAnchor: dynamicAnchor
1462+
dynamicAnchor: dynamicAnchor,
1463+
defs: defs
14161464
)
14171465
}
14181466

@@ -1440,7 +1488,8 @@ extension JSONSchema {
14401488
defaultValue: AnyCodable? = nil,
14411489
examples: [AnyCodable] = [],
14421490
anchor: String? = nil,
1443-
dynamicAnchor: String? = nil
1491+
dynamicAnchor: String? = nil,
1492+
defs: OrderedDictionary<String, JSONSchema> = [:]
14441493
) -> JSONSchema {
14451494
let genericContext = JSONSchema.CoreContext<JSONTypeFormat.IntegerFormat>(
14461495
format: format,
@@ -1456,7 +1505,8 @@ extension JSONSchema {
14561505
defaultValue: defaultValue,
14571506
examples: examples,
14581507
anchor: anchor,
1459-
dynamicAnchor: dynamicAnchor
1508+
dynamicAnchor: dynamicAnchor,
1509+
defs: defs
14601510
)
14611511
let integerContext = JSONSchema.IntegerContext(
14621512
multipleOf: multipleOf,
@@ -1485,7 +1535,8 @@ extension JSONSchema {
14851535
defaultValue: AnyCodable? = nil,
14861536
examples: [AnyCodable] = [],
14871537
anchor: String? = nil,
1488-
dynamicAnchor: String? = nil
1538+
dynamicAnchor: String? = nil,
1539+
defs: OrderedDictionary<String, JSONSchema> = [:]
14891540
) -> JSONSchema {
14901541
return .integer(
14911542
format: format,
@@ -1504,7 +1555,8 @@ extension JSONSchema {
15041555
defaultValue: defaultValue,
15051556
examples: examples,
15061557
anchor: anchor,
1507-
dynamicAnchor: dynamicAnchor
1558+
dynamicAnchor: dynamicAnchor,
1559+
defs: defs
15081560
)
15091561
}
15101562

@@ -1533,7 +1585,8 @@ extension JSONSchema {
15331585
defaultValue: AnyCodable? = nil,
15341586
examples: [AnyCodable] = [],
15351587
anchor: String? = nil,
1536-
dynamicAnchor: String? = nil
1588+
dynamicAnchor: String? = nil,
1589+
defs: OrderedDictionary<String, JSONSchema> = [:]
15371590
) -> JSONSchema {
15381591
let coreContext = JSONSchema.CoreContext<JSONTypeFormat.ObjectFormat>(
15391592
format: format,
@@ -1549,7 +1602,8 @@ extension JSONSchema {
15491602
defaultValue: defaultValue,
15501603
examples: examples,
15511604
anchor: anchor,
1552-
dynamicAnchor: dynamicAnchor
1605+
dynamicAnchor: dynamicAnchor,
1606+
defs: defs
15531607
)
15541608
let objectContext = JSONSchema.ObjectContext(
15551609
properties: properties,
@@ -1585,7 +1639,8 @@ extension JSONSchema {
15851639
defaultValue: AnyCodable? = nil,
15861640
examples: [AnyCodable] = [],
15871641
anchor: String? = nil,
1588-
dynamicAnchor: String? = nil
1642+
dynamicAnchor: String? = nil,
1643+
defs: OrderedDictionary<String, JSONSchema> = [:]
15891644
) -> JSONSchema {
15901645
let coreContext = JSONSchema.CoreContext<JSONTypeFormat.ArrayFormat>(
15911646
format: format,
@@ -1601,7 +1656,8 @@ extension JSONSchema {
16011656
defaultValue: defaultValue,
16021657
examples: examples,
16031658
anchor: anchor,
1604-
dynamicAnchor: dynamicAnchor
1659+
dynamicAnchor: dynamicAnchor,
1660+
defs: defs
16051661
)
16061662

16071663
let arrayContext = JSONSchema.ArrayContext(
@@ -1635,7 +1691,8 @@ extension JSONSchema {
16351691
description: String? = nil,
16361692
discriminator: OpenAPI.Discriminator? = nil,
16371693
anchor: String? = nil,
1638-
dynamicAnchor: String? = nil
1694+
dynamicAnchor: String? = nil,
1695+
defs: OrderedDictionary<String, JSONSchema> = [:]
16391696
) -> JSONSchema {
16401697
return .all(
16411698
of: schemas,
@@ -1645,7 +1702,8 @@ extension JSONSchema {
16451702
description: description,
16461703
discriminator: discriminator,
16471704
anchor: anchor,
1648-
dynamicAnchor: dynamicAnchor
1705+
dynamicAnchor: dynamicAnchor,
1706+
defs: defs
16491707
)
16501708
)
16511709
}
@@ -1667,7 +1725,8 @@ extension JSONSchema {
16671725
description: String? = nil,
16681726
discriminator: OpenAPI.Discriminator? = nil,
16691727
anchor: String? = nil,
1670-
dynamicAnchor: String? = nil
1728+
dynamicAnchor: String? = nil,
1729+
defs: OrderedDictionary<String, JSONSchema> = [:]
16711730
) -> JSONSchema {
16721731
return .one(
16731732
of: schemas,
@@ -1677,7 +1736,8 @@ extension JSONSchema {
16771736
description: description,
16781737
discriminator: discriminator,
16791738
anchor: anchor,
1680-
dynamicAnchor: dynamicAnchor
1739+
dynamicAnchor: dynamicAnchor,
1740+
defs: defs
16811741
)
16821742
)
16831743
}
@@ -1699,7 +1759,8 @@ extension JSONSchema {
16991759
description: String? = nil,
17001760
discriminator: OpenAPI.Discriminator? = nil,
17011761
anchor: String? = nil,
1702-
dynamicAnchor: String? = nil
1762+
dynamicAnchor: String? = nil,
1763+
defs: OrderedDictionary<String, JSONSchema> = [:]
17031764
) -> JSONSchema {
17041765
return .any(
17051766
of: schemas,
@@ -1709,7 +1770,8 @@ extension JSONSchema {
17091770
description: description,
17101771
discriminator: discriminator,
17111772
anchor: anchor,
1712-
dynamicAnchor: dynamicAnchor
1773+
dynamicAnchor: dynamicAnchor,
1774+
defs: defs
17131775
)
17141776
)
17151777
}
@@ -1728,7 +1790,8 @@ extension JSONSchema {
17281790
description: String? = nil,
17291791
discriminator: OpenAPI.Discriminator? = nil,
17301792
anchor: String? = nil,
1731-
dynamicAnchor: String? = nil
1793+
dynamicAnchor: String? = nil,
1794+
defs: OrderedDictionary<String, JSONSchema> = [:]
17321795
) -> JSONSchema {
17331796
return .not(
17341797
schema,
@@ -1738,7 +1801,8 @@ extension JSONSchema {
17381801
description: description,
17391802
discriminator: discriminator,
17401803
anchor: anchor,
1741-
dynamicAnchor: dynamicAnchor
1804+
dynamicAnchor: dynamicAnchor,
1805+
defs: defs
17421806
)
17431807
)
17441808
}
@@ -1750,11 +1814,12 @@ extension JSONSchema {
17501814
title: String? = nil,
17511815
description: String? = nil,
17521816
anchor: String? = nil,
1753-
dynamicAnchor: String? = nil
1817+
dynamicAnchor: String? = nil,
1818+
defs: OrderedDictionary<String, JSONSchema> = [:]
17541819
) -> JSONSchema {
17551820
return .reference(
17561821
reference,
1757-
.init(required: required, title: title, description: description, anchor: anchor, dynamicAnchor: dynamicAnchor)
1822+
.init(required: required, title: title, description: description, anchor: anchor, dynamicAnchor: dynamicAnchor, defs: defs)
17581823
)
17591824
}
17601825
}

0 commit comments

Comments
 (0)