fix #55: make additionalProperties-error-message clearer
Done this by using sub-error-handler of type first_error_handler and constructing a message.
This commit is contained in:
parent
99e05c8335
commit
c0d3a287d3
@ -791,9 +791,14 @@ class object : public schema
|
|||||||
a_prop_or_pattern_matched = true;
|
a_prop_or_pattern_matched = true;
|
||||||
schema_pp.second->validate(ptr / p.key(), p.value(), e);
|
schema_pp.second->validate(ptr / p.key(), p.value(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check additionalProperties as a last resort
|
// check additionalProperties as a last resort
|
||||||
if (!a_prop_or_pattern_matched && additionalProperties_)
|
if (!a_prop_or_pattern_matched && additionalProperties_) {
|
||||||
additionalProperties_->validate(ptr / p.key(), p.value(), e);
|
first_error_handler additional_prop_err;
|
||||||
|
additionalProperties_->validate(ptr / p.key(), p.value(), additional_prop_err);
|
||||||
|
if (additional_prop_err)
|
||||||
|
e.error(ptr, instance, "validation failed for additional property '" + p.key() + "': " + additional_prop_err.message_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto &dep : dependencies_) {
|
for (auto &dep : dependencies_) {
|
||||||
|
|||||||
@ -45,6 +45,7 @@ static json person_schema = R"(
|
|||||||
"name",
|
"name",
|
||||||
"age"
|
"age"
|
||||||
],
|
],
|
||||||
|
"additionalProperties": false,
|
||||||
"type": "object"
|
"type": "object"
|
||||||
})"_json;
|
})"_json;
|
||||||
|
|
||||||
@ -88,19 +89,20 @@ int main(void)
|
|||||||
|
|
||||||
validator.validate({{"age", 42}}, err); // no name
|
validator.validate({{"age", 42}}, err); // no name
|
||||||
|
|
||||||
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
|
|
||||||
EXPECT_EQ(err.failed_pointers.size(), 1);
|
EXPECT_EQ(err.failed_pointers.size(), 1);
|
||||||
|
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
|
||||||
err.reset();
|
err.reset();
|
||||||
|
|
||||||
validator.validate({{"street", "Boulevard"}}, err); // no name and no age
|
validator.validate({{"street", "Boulevard"}}, err); // no name and no age
|
||||||
|
EXPECT_EQ(err.failed_pointers.size(), 3);
|
||||||
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
|
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
|
||||||
EXPECT_EQ(err.failed_pointers[1].to_string(), "");
|
EXPECT_EQ(err.failed_pointers[1].to_string(), "");
|
||||||
EXPECT_EQ(err.failed_pointers.size(), 2);
|
EXPECT_EQ(err.failed_pointers[2].to_string(), "");
|
||||||
err.reset();
|
err.reset();
|
||||||
|
|
||||||
validator.validate({{"age", 42}, {"name", 12}}, err); // name must be a string
|
validator.validate({{"age", 42}, {"name", 12}}, err); // name must be a string
|
||||||
EXPECT_EQ(err.failed_pointers[0].to_string(), "/name");
|
|
||||||
EXPECT_EQ(err.failed_pointers.size(), 1);
|
EXPECT_EQ(err.failed_pointers.size(), 1);
|
||||||
|
EXPECT_EQ(err.failed_pointers[0].to_string(), "/name");
|
||||||
err.reset();
|
err.reset();
|
||||||
|
|
||||||
validator.validate({
|
validator.validate({
|
||||||
@ -109,8 +111,19 @@ int main(void)
|
|||||||
{"phones", {1234, "223"}},
|
{"phones", {1234, "223"}},
|
||||||
},
|
},
|
||||||
err); // name must be a string
|
err); // name must be a string
|
||||||
EXPECT_EQ(err.failed_pointers[0].to_string(), "/phones/1");
|
|
||||||
EXPECT_EQ(err.failed_pointers.size(), 1);
|
EXPECT_EQ(err.failed_pointers.size(), 1);
|
||||||
|
EXPECT_EQ(err.failed_pointers[0].to_string(), "/phones/1");
|
||||||
|
err.reset();
|
||||||
|
|
||||||
|
validator.validate({
|
||||||
|
{"age", 42},
|
||||||
|
{"name", "John"},
|
||||||
|
{"phones", {0}},
|
||||||
|
{"post-code", 12345},
|
||||||
|
},
|
||||||
|
err); // name must be a string
|
||||||
|
EXPECT_EQ(err.failed_pointers.size(), 1);
|
||||||
|
EXPECT_EQ(err.failed_pointers[0].to_string(), "");
|
||||||
err.reset();
|
err.reset();
|
||||||
|
|
||||||
return error_count;
|
return error_count;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user