|
|
@@ -198,13 +198,11 @@ public:
|
|
|
Status visit(constraint::TupleConstraint const & cons) const {
|
|
|
NOOP_UNLESS_TYPE(Array);
|
|
|
|
|
|
- auto array = document_.as_array();
|
|
|
- if (array.size() < cons.items.size()) {
|
|
|
- return Status::Reject;
|
|
|
- }
|
|
|
-
|
|
|
Status rval = Status::Accept;
|
|
|
- for (size_t i = 0; i < cons.items.size(); ++i) {
|
|
|
+
|
|
|
+ auto array = document_.as_array();
|
|
|
+ size_t const n = std::min(cons.items.size(), array.size());
|
|
|
+ for (size_t i = 0; i < n; ++i) {
|
|
|
rval &= validate_subschema_on(cons.items[i], array[i], i);
|
|
|
if (!rval && result_ == nullptr) {
|
|
|
break;
|
|
|
@@ -331,7 +329,18 @@ public:
|
|
|
NOOP_UNLESS_TYPE(Object);
|
|
|
|
|
|
Status rval = Status::Accept;
|
|
|
- for (auto const & [key, elem] : document_.as_object()) {
|
|
|
+ auto object = document_.as_object();
|
|
|
+
|
|
|
+ if constexpr (MutableAdapter<A>) {
|
|
|
+ for (auto const & [key, subschema] : cons.properties) {
|
|
|
+ auto const * default_value = subschema->default_value();
|
|
|
+ if (default_value && not object.contains(key)) {
|
|
|
+ object.assign(key, *default_value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (auto const & [key, elem] : object) {
|
|
|
if (auto it = cons.properties.find(key); it != cons.properties.end()) {
|
|
|
rval &= validate_subschema_on(it->second, elem, key);
|
|
|
}
|