diff --git a/src/json-validator.cpp b/src/json-validator.cpp index b279f23..f78ce4d 100644 --- a/src/json-validator.cpp +++ b/src/json-validator.cpp @@ -503,6 +503,7 @@ class type_schema : public schema std::vector> type_; std::pair enum_, const_; std::vector> logic_; + bool read_only_ = false; static std::shared_ptr make(json &schema, json::value_t type, @@ -553,8 +554,15 @@ class type_schema : public schema else_->validate(ptr, instance, patch, e); } } - if (instance.is_null()) { + + if (instance.is_null()) patch.add(nlohmann::json::json_pointer{}, default_value_); + + // enforce default value if any read only values + if(read_only_) { + auto rod_value = default_value(ptr, instance, e); + if(rod_value != nullptr && instance != rod_value) + e.error(ptr, instance, "key is read-only"); } } @@ -623,6 +631,12 @@ public: sch.erase(attr); } + attr = sch.find("readOnly"); + if (attr != sch.end()) { + read_only_ = attr.value().get(); + sch.erase(attr); + } + for (auto &key : known_keywords) sch.erase(key); @@ -1460,3 +1474,4 @@ json json_validator::validate(const json &instance, error_handler &err, const js } // namespace json_schema } // namespace nlohmann + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9fa9c5b..e089d7f 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -77,3 +77,7 @@ add_test(NAME issue-189-default-values COMMAND issue-189-default-values) add_executable(issue-243-root-default-values issue-243-root-default-values.cpp) target_link_libraries(issue-243-root-default-values nlohmann_json_schema_validator) add_test(NAME issue-243-root-default-values COMMAND issue-243-root-default-values) + +add_executable(issue-212-read-only-values read-only-values.cpp) +target_link_libraries(issue-212-read-only-values nlohmann_json_schema_validator) +add_test(NAME issue-212-read-only-values COMMAND issue-212-read-only-values) diff --git a/test/read-only-values.cpp b/test/read-only-values.cpp new file mode 100644 index 0000000..4f3c28c --- /dev/null +++ b/test/read-only-values.cpp @@ -0,0 +1,28 @@ +#include + +using nlohmann::json; +using nlohmann::json_schema::json_validator; + +static const json read_only_schema = R"({ + "type": "object", + "properties": { + "debug": { + "type": "boolean", + "default": false, + "readOnly": true + } + } +})"_json; + +int main() { + json_validator validator(read_only_schema); + try { + validator.validate(R"({ + "debug": true + })"_json); + } catch (const std::exception&e ) { + return EXIT_SUCCESS; + } + + return EXIT_FAILURE; +}