Skip to content

Commit e74dc4a

Browse files
committed
feat: support prefixItems for draft 2020-12
1 parent 78cee2a commit e74dc4a

File tree

3 files changed

+14
-7
lines changed

3 files changed

+14
-7
lines changed

Sources/Applicators/items.swift

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,26 @@ func items(context: Context, items: Any, instance: Any, schema: [String: Any]) t
33
return AnySequence(EmptyCollection())
44
}
55

6+
let instances: [(Int, Any)]
7+
if let prefixItems = schema["prefixItems"] as? [Any] {
8+
guard instance.count > prefixItems.count else {
9+
return AnySequence(EmptyCollection())
10+
}
11+
instances = Array(Array(instance.enumerated())[prefixItems.count...])
12+
} else {
13+
instances = Array(instance.enumerated())
14+
}
15+
616
if let items = items as? [String: Any] {
7-
return try AnySequence(Array(instance.enumerated()).map { (index, instance) throws -> AnySequence<ValidationError> in
17+
return try AnySequence(instances.map { (index, instance) throws -> AnySequence<ValidationError> in
818
context.instanceLocation.push(index.description)
919
defer { context.instanceLocation.pop() }
1020
return try context.descend(instance: instance, subschema: items)
1121
}.joined())
1222
}
1323

1424
if let items = items as? Bool {
15-
return try AnySequence(Array(instance.enumerated()).map { (index, instance) throws -> AnySequence<ValidationError> in
25+
return try AnySequence(instances.map { (index, instance) throws -> AnySequence<ValidationError> in
1626
context.instanceLocation.push(index.description)
1727
defer { context.instanceLocation.pop() }
1828
return try context.descend(instance: instance, subschema: items)
@@ -22,7 +32,7 @@ func items(context: Context, items: Any, instance: Any, schema: [String: Any]) t
2232
if let items = items as? [Any] {
2333
var results = [AnySequence<ValidationError>]()
2434

25-
for (index, item) in instance.enumerated() where index < items.count {
35+
for (index, item) in instances where index < items.count {
2636
context.instanceLocation.push(index.description)
2737
defer { context.instanceLocation.pop() }
2838
results.append(try context.descend(instance: item, subschema: items[index]))

Sources/Draft202012Validator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class Draft202012Validator: Validator {
3636
"minProperties": minProperties,
3737
"maxProperties": maxProperties,
3838
"items": items,
39-
"additionalItems": additionalItems,
39+
"prefixItems": prefixItems,
4040
"patternProperties": patternProperties,
4141
"additionalProperties": additionalProperties,
4242
"$ref": ref,

Tests/JSONSchemaTests/JSONSchemaCases.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,7 @@ class JSONSchemaCases: XCTestCase {
196196
"id.json",
197197

198198
"ref.json",
199-
"uniqueItems.json",
200-
"prefixItems.json",
201199
"dynamicRef.json",
202-
"items.json",
203200

204201
// unsupported
205202
"unevaluatedProperties.json",

0 commit comments

Comments
 (0)