WIP facilitates inclusion of multiple meta-schema dialects
This commit is contained in:
parent
a244024759
commit
cd862228d6
6
.gitmodules
vendored
Normal file
6
.gitmodules
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[submodule "json-schema-spec"]
|
||||||
|
path = json-schema-spec/2020-12
|
||||||
|
url = ../../json-schema-org/json-schema-spec.git
|
||||||
|
[submodule "json-schema-spec_2019-09"]
|
||||||
|
path = json-schema-spec/2019-09
|
||||||
|
url = ../../json-schema-org/json-schema-spec.git
|
||||||
@ -1,4 +1,4 @@
|
|||||||
cmake_minimum_required(VERSION 3.14)
|
cmake_minimum_required(VERSION 3.19)
|
||||||
# CMake version compatibility
|
# CMake version compatibility
|
||||||
# TODO: Remove when bumping cmake >= 3.25
|
# TODO: Remove when bumping cmake >= 3.25
|
||||||
if (POLICY CMP0140)
|
if (POLICY CMP0140)
|
||||||
@ -151,6 +151,9 @@ add_subdirectory(src)
|
|||||||
|
|
||||||
# Enable examples
|
# Enable examples
|
||||||
|
|
||||||
|
# Convert meta-schema into strings and include into build
|
||||||
|
add_subdirectory(json-schema-spec)
|
||||||
|
|
||||||
# Enable testings
|
# Enable testings
|
||||||
if (JSON_VALIDATOR_BUILD_TESTS)
|
if (JSON_VALIDATOR_BUILD_TESTS)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
@ -161,7 +164,6 @@ if (JSON_VALIDATOR_BUILD_EXAMPLES)
|
|||||||
add_subdirectory(example)
|
add_subdirectory(example)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
|
||||||
#[==============================================================================================[
|
#[==============================================================================================[
|
||||||
# Install or Export #
|
# Install or Export #
|
||||||
]==============================================================================================]
|
]==============================================================================================]
|
||||||
|
|||||||
1
json-schema-spec/2019-09
Submodule
1
json-schema-spec/2019-09
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit c8eb3d320f60eca7cfb18da25337a426ceb40eaa
|
||||||
1
json-schema-spec/2020-12
Submodule
1
json-schema-spec/2020-12
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 0d2e45422eda1dd5d3eb76905cb816b612d63a5b
|
||||||
44
json-schema-spec/CMakeLists.txt
Normal file
44
json-schema-spec/CMakeLists.txt
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#[==============================================================================================[
|
||||||
|
# Meta-schema Generation #
|
||||||
|
]==============================================================================================]
|
||||||
|
|
||||||
|
function (addSchemaFileToBuild META_SCHEMA_PATH)
|
||||||
|
file(READ ${META_SCHEMA_PATH} FILE_CONTENT)
|
||||||
|
string(JSON META_SCHEMA_ID GET ${FILE_CONTENT} "$id")
|
||||||
|
string(REPLACE "(" "-^-(" FILE_CONTENT "${FILE_CONTENT}") # work around the reality that there may be '(' within strings
|
||||||
|
string(REPLACE ")" ")-^-" FILE_CONTENT "${FILE_CONTENT}") # work around the reality that there may be ')' within strings
|
||||||
|
#string(REPLACE "\n" ")\"\nR\"(" FILE_CONTENT "${FILE_CONTENT}") # break lines into separate strings so that they are not too long for VS
|
||||||
|
set(SOURCES ${SOURCES} PARENT_SCOPE)
|
||||||
|
file (APPEND ${SCHEMA_CPP_FILE_NAME} " {\"${META_SCHEMA_ID}\",\nR\"(")
|
||||||
|
file (APPEND ${SCHEMA_CPP_FILE_NAME} ${FILE_CONTENT})
|
||||||
|
file (APPEND ${SCHEMA_CPP_FILE_NAME} ")\"_json},\n")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# this logic is such that the schema header file will only be generated once; until a "clean"
|
||||||
|
set(SCHEMA_BASE_FILE_NAME builtin_schema_map)
|
||||||
|
set(SCHEMA_BASE_FILE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${SCHEMA_BASE_FILE_NAME})
|
||||||
|
set(SCHEMA_HEADER_FILE_NAME ${SCHEMA_BASE_FILE_PATH}.h)
|
||||||
|
set(SCHEMA_CPP_FILE_NAME ${SCHEMA_BASE_FILE_PATH}.cpp)
|
||||||
|
if (EXISTS ${SCHEMA_HEADER_FILE_NAME})
|
||||||
|
message("Not re-generating meta schema source files")
|
||||||
|
else()
|
||||||
|
file (WRITE ${SCHEMA_HEADER_FILE_NAME} "#include <map>\n#include <string>\n#include <nlohmann/json.hpp>\nnamespace nlohmann {\n namespace json_schema {\n const extern std::map<std::string,json> builtin_schema_map;\n }\n}\n")
|
||||||
|
file (WRITE ${SCHEMA_CPP_FILE_NAME} "#include \"${SCHEMA_BASE_FILE_NAME}.h\"\nnamespace nlohmann {\n namespace json_schema {\n const std::map<std::string,json> builtin_schema_map = {\n")
|
||||||
|
file (GLOB META_SCHEMA_PATHS
|
||||||
|
2019-09/meta/*.json
|
||||||
|
2020-12/meta/*.json
|
||||||
|
)
|
||||||
|
LIST(APPEND META_SCHEMA_PATHS
|
||||||
|
2019-09/schema.json
|
||||||
|
2020-12/schema.json
|
||||||
|
)
|
||||||
|
message("META_SCHEMA_PATHS = ${META_SCHEMA_PATHS}")
|
||||||
|
foreach(ext_json_path ${META_SCHEMA_PATHS})
|
||||||
|
addSchemaFileToBuild(${ext_json_path} APPEND) # subsequent invocations of addSchemaFileToBuild(), use APPEND
|
||||||
|
endforeach()
|
||||||
|
file (APPEND ${SCHEMA_CPP_FILE_NAME} " };\n }\n}\n")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_sources(nlohmann_json_schema_validator PRIVATE ${SCHEMA_CPP_FILE_NAME})
|
||||||
|
target_include_directories(nlohmann_json_schema_validator PRIVATE ${CMAKE_BINARY_DIR}/json-schema-spec)
|
||||||
|
|
||||||
11
json-schema-spec/README.md
Normal file
11
json-schema-spec/README.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# JSON Schema Spec
|
||||||
|
|
||||||
|
This directory contains several dialects of the JSON, also known
|
||||||
|
as meta-schema.
|
||||||
|
This is done using git submodules, so that the upstream version
|
||||||
|
can be tracked and updated easily.
|
||||||
|
|
||||||
|
The `2019-09` dialect is not really supported, nor is it intended
|
||||||
|
to be.
|
||||||
|
However, it is included here as an example of how multiple dialects
|
||||||
|
will be supported, looking forward to the next release.
|
||||||
58
schema
58
schema
@ -1,58 +0,0 @@
|
|||||||
{
|
|
||||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
||||||
"$id": "https://json-schema.org/draft/2020-12/schema",
|
|
||||||
"$vocabulary": {
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/core": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/applicator": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/validation": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/meta-data": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/content": true
|
|
||||||
},
|
|
||||||
"$dynamicAnchor": "meta",
|
|
||||||
|
|
||||||
"title": "Core and Validation specifications meta-schema",
|
|
||||||
"allOf": [
|
|
||||||
{"$ref": "meta/core"},
|
|
||||||
{"$ref": "meta/applicator"},
|
|
||||||
{"$ref": "meta/unevaluated"},
|
|
||||||
{"$ref": "meta/validation"},
|
|
||||||
{"$ref": "meta/meta-data"},
|
|
||||||
{"$ref": "meta/format-annotation"},
|
|
||||||
{"$ref": "meta/content"}
|
|
||||||
],
|
|
||||||
"type": ["object", "boolean"],
|
|
||||||
"$comment": "This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.",
|
|
||||||
"properties": {
|
|
||||||
"definitions": {
|
|
||||||
"$comment": "\"definitions\" has been replaced by \"$defs\".",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": { "$dynamicRef": "#meta" },
|
|
||||||
"deprecated": true,
|
|
||||||
"default": {}
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"$comment": "\"dependencies\" has been split and replaced by \"dependentSchemas\" and \"dependentRequired\" in order to serve their differing semantics.",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"anyOf": [
|
|
||||||
{ "$dynamicRef": "#meta" },
|
|
||||||
{ "$ref": "meta/validation#/$defs/stringArray" }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"deprecated": true,
|
|
||||||
"default": {}
|
|
||||||
},
|
|
||||||
"$recursiveAnchor": {
|
|
||||||
"$comment": "\"$recursiveAnchor\" has been replaced by \"$dynamicAnchor\".",
|
|
||||||
"$ref": "meta/core#/$defs/anchorString",
|
|
||||||
"deprecated": true
|
|
||||||
},
|
|
||||||
"$recursiveRef": {
|
|
||||||
"$comment": "\"$recursiveRef\" has been replaced by \"$dynamicRef\".",
|
|
||||||
"$ref": "meta/core#/$defs/uriReferenceString",
|
|
||||||
"deprecated": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,6 +1,5 @@
|
|||||||
target_sources(nlohmann_json_schema_validator PRIVATE
|
target_sources(nlohmann_json_schema_validator PRIVATE
|
||||||
smtp-address-validator.cpp
|
smtp-address-validator.cpp
|
||||||
json-schema-draft_2020-12.json.cpp
|
|
||||||
json-uri.cpp
|
json-uri.cpp
|
||||||
json-validator.cpp
|
json-validator.cpp
|
||||||
json-patch.cpp
|
json-patch.cpp
|
||||||
|
|||||||
@ -1,75 +0,0 @@
|
|||||||
/*
|
|
||||||
* JSON schema validator for JSON for modern C++
|
|
||||||
*
|
|
||||||
* Copyright (c) 2016-2019 Patrick Boettcher <p@yai.se>.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: MIT
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include <nlohmann/json.hpp>
|
|
||||||
|
|
||||||
namespace nlohmann
|
|
||||||
{
|
|
||||||
namespace json_schema
|
|
||||||
{
|
|
||||||
|
|
||||||
json draft_2020_12_schema_builtin = R"( {
|
|
||||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
||||||
"$id": "https://json-schema.org/draft/2020-12/schema",
|
|
||||||
"$vocabulary": {
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/core": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/applicator": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/unevaluated": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/validation": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/meta-data": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/format-annotation": true,
|
|
||||||
"https://json-schema.org/draft/2020-12/vocab/content": true
|
|
||||||
},
|
|
||||||
"$dynamicAnchor": "meta",
|
|
||||||
|
|
||||||
"title": "Core and Validation specifications meta-schema",
|
|
||||||
"allOf": [
|
|
||||||
{"$ref": "meta/core"},
|
|
||||||
{"$ref": "meta/applicator"},
|
|
||||||
{"$ref": "meta/unevaluated"},
|
|
||||||
{"$ref": "meta/validation"},
|
|
||||||
{"$ref": "meta/meta-data"},
|
|
||||||
{"$ref": "meta/format-annotation"},
|
|
||||||
{"$ref": "meta/content"}
|
|
||||||
],
|
|
||||||
"type": ["object", "boolean"],
|
|
||||||
"$comment": "This meta-schema also defines keywords that have appeared in previous drafts in order to prevent incompatible extensions as they remain in common use.",
|
|
||||||
"properties": {
|
|
||||||
"definitions": {
|
|
||||||
"$comment": "\"definitions\" has been replaced by \"$defs\".",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": { "$dynamicRef": "#meta" },
|
|
||||||
"deprecated": true,
|
|
||||||
"default": {}
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"$comment": "\"dependencies\" has been split and replaced by \"dependentSchemas\" and \"dependentRequired\" in order to serve their differing semantics.",
|
|
||||||
"type": "object",
|
|
||||||
"additionalProperties": {
|
|
||||||
"anyOf": [
|
|
||||||
{ "$dynamicRef": "#meta" },
|
|
||||||
{ "$ref": "meta/validation#/$defs/stringArray" }
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"deprecated": true,
|
|
||||||
"default": {}
|
|
||||||
},
|
|
||||||
"$recursiveAnchor": {
|
|
||||||
"$comment": "\"$recursiveAnchor\" has been replaced by \"$dynamicAnchor\".",
|
|
||||||
"$ref": "meta/core#/$defs/anchorString",
|
|
||||||
"deprecated": true
|
|
||||||
},
|
|
||||||
"$recursiveRef": {
|
|
||||||
"$comment": "\"$recursiveRef\" has been replaced by \"$dynamicRef\".",
|
|
||||||
"$ref": "meta/core#/$defs/uriReferenceString",
|
|
||||||
"deprecated": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} )"_json;
|
|
||||||
}
|
|
||||||
} // namespace nlohmann
|
|
||||||
@ -31,6 +31,8 @@
|
|||||||
# error "expected existing NLOHMANN_JSON_VERSION_MAJOR preproc variable, please update to NLohmann's JSON 3.8.0"
|
# error "expected existing NLOHMANN_JSON_VERSION_MAJOR preproc variable, please update to NLohmann's JSON 3.8.0"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//#include "builtin_schema_map.h"
|
||||||
|
|
||||||
// make yourself a home - welcome to nlohmann's namespace
|
// make yourself a home - welcome to nlohmann's namespace
|
||||||
namespace nlohmann
|
namespace nlohmann
|
||||||
{
|
{
|
||||||
@ -127,8 +129,7 @@ public:
|
|||||||
|
|
||||||
namespace json_schema
|
namespace json_schema
|
||||||
{
|
{
|
||||||
|
const extern std::map<std::string,json> builtin_schema_map;
|
||||||
extern json draft_2020_12_schema_builtin;
|
|
||||||
|
|
||||||
typedef std::function<void(const json_uri & /*id*/, json & /*value*/)> schema_loader;
|
typedef std::function<void(const json_uri & /*id*/, json & /*value*/)> schema_loader;
|
||||||
typedef std::function<void(const std::string & /*format*/, const std::string & /*value*/)> format_checker;
|
typedef std::function<void(const std::string & /*format*/, const std::string & /*value*/)> format_checker;
|
||||||
|
|||||||
@ -18,8 +18,8 @@ using nlohmann::json_schema::json_validator;
|
|||||||
|
|
||||||
static void loader(const json_uri &uri, json &schema)
|
static void loader(const json_uri &uri, json &schema)
|
||||||
{
|
{
|
||||||
if (uri.location() == "http://json-schema.org/draft/2020-12/schema") {
|
if (nlohmann::json_schema::builtin_schema_map.count(uri.location()) > 0) {
|
||||||
schema = nlohmann::json_schema::draft_2020_12_schema_builtin;
|
schema = nlohmann::json_schema::builtin_schema_map.at(uri.location());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user