diff --git a/src/json-validator.cpp b/src/json-validator.cpp index 7f34553..0be48f8 100644 --- a/src/json-validator.cpp +++ b/src/json-validator.cpp @@ -498,6 +498,37 @@ bool logical_combination::is_validate_complete(const json &instance, cons return count > 1; } +json apply_patch_from(const json &instance, const json_patch &patch, const json::json_pointer &ptr) +{ + if (patch.operator json().empty()) { + return instance; + } + + json patched_instance = json::parse(instance.dump()); + + json array = patch.operator json(); + std::string ptr_string = ptr.to_string(); + size_t ptr_string_length = ptr_string.length(); + for (auto item = array.begin(); item != array.end(); ++item) { + std::string path = item->at("path"); + if (path.find(ptr_string) != 0) + continue; + try { + json single_patch = { + { + {"path", path.substr(ptr_string_length)}, // + {"op", item->at("op")}, // + {"value", item->at("value")} // + } // + }; + patched_instance = patched_instance.patch(single_patch); + } catch (...) { + } + } + + return patched_instance; +} + class type_schema : public schema { std::vector> type_; @@ -543,14 +574,14 @@ class type_schema : public schema if (if_) { first_error_handler err; - - if_->validate(ptr, instance, patch, err); + json patched_instance = apply_patch_from(instance, patch, ptr); + if_->validate(ptr, patched_instance, patch, err); if (!err) { if (then_) - then_->validate(ptr, instance, patch, e); + then_->validate(ptr, patched_instance, patch, e); } else { if (else_) - else_->validate(ptr, instance, patch, e); + else_->validate(ptr, patched_instance, patch, e); } } } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fd1c309..13ba971 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -73,3 +73,7 @@ add_test(NAME issue-149-entry-selection COMMAND issue-149-entry-selection) add_executable(issue-189-default-values issue-189-default-values.cpp) target_link_libraries(issue-189-default-values nlohmann_json_schema_validator) add_test(NAME issue-189-default-values COMMAND issue-189-default-values) + +add_executable(issue-228-if-default-values issue-228-if-default-values.cpp) +target_link_libraries(issue-228-if-default-values nlohmann_json_schema_validator) +add_test(NAME issue-228-if-default-values COMMAND issue-228-if-default-values) \ No newline at end of file diff --git a/test/issue-228-if-default-values.cpp b/test/issue-228-if-default-values.cpp new file mode 100644 index 0000000..d02208d --- /dev/null +++ b/test/issue-228-if-default-values.cpp @@ -0,0 +1,45 @@ +#include +#include + +using nlohmann::json; +using nlohmann::json_uri; +using nlohmann::json_schema::json_validator; + +static const json default_schema = R"( +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "condition": { + "type": "boolean", + "default": false + }, + "data": { + "type": "string" + } + }, + "if": { + "properties": { "condition": { "const": true } } + }, + "then": { + "required": ["data"] + } +})"_json; + +static void loader(const json_uri &uri, json &schema) +{ + schema = default_schema; +} + +int main(void) +{ + json_validator validator(loader); + + validator.set_root_schema(default_schema); + + json no_county_for_nlohmann = json::object(); + + validator.validate(no_county_for_nlohmann); + + return 0; +}