| 1197 | }; |
| 1198 | |
| 1199 | class array : public schema |
| 1200 | { |
| 1201 | std::pair<bool, size_t> maxItems_{false, 0}; |
| 1202 | std::pair<bool, size_t> minItems_{false, 0}; |
| 1203 | bool uniqueItems_ = false; |
| 1204 | |
| 1205 | std::shared_ptr<schema> items_schema_; |
| 1206 | |
| 1207 | std::vector<std::shared_ptr<schema>> items_; |
| 1208 | std::shared_ptr<schema> additionalItems_; |
| 1209 | |
| 1210 | std::shared_ptr<schema> contains_; |
| 1211 | |
| 1212 | void validate(const json::json_pointer &ptr, const json &instance, json_patch &patch, error_handler &e) const override |
| 1213 | { |
| 1214 | if (maxItems_.first && instance.size() > maxItems_.second) |
| 1215 | e.error(ptr, instance, "array has too many items"); |
| 1216 | |
| 1217 | if (minItems_.first && instance.size() < minItems_.second) |
| 1218 | e.error(ptr, instance, "array has too few items"); |
| 1219 | |
| 1220 | if (uniqueItems_) { |
| 1221 | for (auto it = instance.cbegin(); it != instance.cend(); ++it) { |
| 1222 | auto v = std::find(it + 1, instance.end(), *it); |
| 1223 | if (v != instance.end()) |
| 1224 | e.error(ptr, instance, "items have to be unique for this array"); |
| 1225 | } |
| 1226 | } |
| 1227 | |
| 1228 | size_t index = 0; |
| 1229 | if (items_schema_) |
| 1230 | for (auto &i : instance) { |
| 1231 | items_schema_->validate(ptr / index, i, patch, e); |
| 1232 | index++; |
| 1233 | } |
| 1234 | else { |
| 1235 | auto item = items_.cbegin(); |
| 1236 | for (auto &i : instance) { |
| 1237 | std::shared_ptr<schema> item_validator; |
| 1238 | if (item == items_.cend()) |
| 1239 | item_validator = additionalItems_; |
| 1240 | else { |
| 1241 | item_validator = *item; |
| 1242 | item++; |
| 1243 | } |
| 1244 | |
| 1245 | if (!item_validator) |
| 1246 | break; |
| 1247 | |
| 1248 | item_validator->validate(ptr / index, i, patch, e); |
| 1249 | } |
| 1250 | } |
| 1251 | |
| 1252 | if (contains_) { |
| 1253 | bool contained = false; |
| 1254 | for (auto &item : instance) { |
| 1255 | first_error_handler local_e; |
| 1256 | contains_->validate(ptr, item, patch, local_e); |