This commit is contained in:
Spuriosity1i 2021-03-09 22:09:53 +11:00
commit 7fc4dbe967
5 changed files with 73 additions and 6 deletions

View File

@ -121,6 +121,8 @@ access nlohmann-json:
a sub-directory (via `add_subdirectory()`), 2 and 3 can be a sub-directory (via `add_subdirectory()`), 2 and 3 can be
assisted by setting the `nlohmann_json_DIR`-variable. assisted by setting the `nlohmann_json_DIR`-variable.
For 1 there is an example of you to do in example/cmake-submodule.
### Building with Hunter package manager ### Building with Hunter package manager
To enable access to nlohmann json library, Hunter can be used. Just run with HUNTER_ENABLED=ON option. No further dependencies needed To enable access to nlohmann json library, Hunter can be used. Just run with HUNTER_ENABLED=ON option. No further dependencies needed

View File

@ -0,0 +1,24 @@
cmake_minimum_required(VERSION 3.2)
project(simple-json-validator-as-submodule-test)
# absolute-path
set(PATH_TO_NLOHMANN_JSON_REPO $ENV{HOME}/devel/upstream/json)
# build shared library
set(BUILD_SHARED_LIBS ON)
# JSON library
option(JSON_BuildTests OFF)
add_subdirectory(${PATH_TO_NLOHMANN_JSON_REPO}
json-binary-dir
EXCLUDE_FROM_ALL)
# JSON SCHEMA VALIDATOR library
option(BUILD_TESTS OFF)
add_subdirectory(../..
json-validator-binary-dir
EXCLUDE_FROM_ALL)
add_executable(validate validate.cpp)
target_link_libraries(validate nlohmann_json_schema_validator)

View File

@ -0,0 +1,20 @@
#include <nlohmann/json-schema.hpp>
#include <iostream>
int main(void)
{
nlohmann::json schema_json{{"type", "number"}};
nlohmann::json_schema::json_validator validator;
validator.set_root_schema(schema_json);
validator.validate(1);
try {
validator.validate("\"1\"");
} catch (const std::exception &e) {
std::cerr << "expected exception: " << e.what() << "\n";
return EXIT_SUCCESS;
}
return EXIT_FAILURE;
}

View File

@ -66,7 +66,7 @@ const nlohmann::json patch_schema = R"patch({
} }
} }
})patch"_json; })patch"_json;
}; // namespace } // namespace
namespace nlohmann namespace nlohmann
{ {

View File

@ -13,6 +13,7 @@
#include <memory> #include <memory>
#include <set> #include <set>
#include <sstream> #include <sstream>
#include <deque>
using nlohmann::json; using nlohmann::json;
using nlohmann::json_patch; using nlohmann::json_patch;
@ -171,11 +172,31 @@ public:
auto unresolved = file.unresolved.find(fragment); auto unresolved = file.unresolved.find(fragment);
if (unresolved != file.unresolved.end()) if (unresolved != file.unresolved.end())
schema::make(value, this, {}, {{new_uri}}); schema::make(value, this, {}, {{new_uri}});
else // no, nothing ref'd it, keep for later else { // no, nothing ref'd it, keep for later
// could use fragment here, but better not to: if key is an integer the pointer will be interpreted as
// an array. This cannot be the case here, so we force using key as a string when storing the // need to create an object for each reference-token in the
// unknown_keyword-schema. // JSON-Pointer When not existing, a stringified integer reference
file.unknown_keywords[uri.pointer()][key] = value; // token (e.g. "123") in the middle of the pointer will be
// interpreted a an array-index and an array will be created.
// json_pointer's reference_tokens is private - get them
std::deque<std::string> ref_tokens;
auto uri_pointer = uri.pointer();
while (!uri_pointer.empty()) {
ref_tokens.push_front(uri_pointer.back());
uri_pointer.pop_back();
}
// for each token create an object, if not already existing
auto unk_kw = &file.unknown_keywords;
for (auto &rt : ref_tokens) {
auto existing_object = unk_kw->find(rt);
if (existing_object == unk_kw->end())
(*unk_kw)[rt] = json::object();
unk_kw = &(*unk_kw)[rt];
}
(*unk_kw)[key] = value;
}
// recursively add possible subschemas of unknown keywords // recursively add possible subschemas of unknown keywords
if (value.type() == json::value_t::object) if (value.type() == json::value_t::object)