@@ -20,6 +20,12 @@ import Foundation
20
20
{ {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } var multipleOf: T?
21
21
}
22
22
23
+ { {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } struct ArrayRule {
24
+ {{#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } var minItems: Int?
25
+ { {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } var maxItems: Int?
26
+ { {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } var uniqueItems: Bool
27
+ }
28
+
23
29
{ {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } enum StringValidationErrorKind: Error {
24
30
case minLength, maxLength, pattern
25
31
}
@@ -28,6 +34,10 @@ import Foundation
28
34
case minimum, maximum, multipleOf
29
35
}
30
36
37
+ { {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } enum ArrayValidationErrorKind: Error {
38
+ case minItems, maxItems, uniqueItems
39
+ }
40
+
31
41
{ {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } struct ValidationError<T: Error & Hashable >: Error {
32
42
{{#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } fileprivate(set) var kinds: Set<T >
33
43
}
@@ -123,4 +133,29 @@ import Foundation
123
133
}
124
134
return numeric
125
135
}
136
+
137
+ /// Validate a array against a rule.
138
+ /// - Parameter array: The Array you wish to validate.
139
+ /// - Parameter rule: The ArrayRule you wish to use for validation.
140
+ /// - Returns: A validated array.
141
+ /// - Throws: `ValidationError<ArrayValidationErrorKind >` if the string is invalid against the rule.
142
+ { {#nonPublicApi} }internal{ {/nonPublicApi} }{ {^nonPublicApi} }public{ {/nonPublicApi} } static func validate(_ array: Array<AnyHashable >, against rule: ArrayRule) throws -> Array<AnyHashable > {
143
+ var error = ValidationError< ArrayValidationErrorKind> (kinds: [])
144
+ if let minItems = rule.minItems, ! (minItems <= array.count) {
145
+ error.kinds.insert (.minItems)
146
+ }
147
+ if let maxItems = rule.maxItems, !(array.count <= maxItems) {
148
+ error.kinds.insert (.maxItems)
149
+ }
150
+ if rule.uniqueItems {
151
+ let unique = Set(array)
152
+ if unique.count != array.count {
153
+ error.kinds.insert (.uniqueItems)
154
+ }
155
+ }
156
+ guard error.kinds.isEmpty else {
157
+ throw error
158
+ }
159
+ return array
160
+ }
126
161
}
0 commit comments