Merge ff35afd5a5 into f4194d7e24
This commit is contained in:
commit
f9817db99b
@ -88,7 +88,12 @@ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.24)
|
|||||||
GIT_TAG ${JSON_FETCH_VERSION}
|
GIT_TAG ${JSON_FETCH_VERSION}
|
||||||
FIND_PACKAGE_ARGS
|
FIND_PACKAGE_ARGS
|
||||||
)
|
)
|
||||||
list(APPEND fetch_packages nlohmann_json)
|
FetchContent_Declare(CLI11
|
||||||
|
GIT_REPOSITORY https://github.com/CLIUtils/CLI11
|
||||||
|
GIT_TAG v2.3.2
|
||||||
|
FIND_PACKAGE_ARGS
|
||||||
|
)
|
||||||
|
list(APPEND fetch_packages nlohmann_json CLI11)
|
||||||
else ()
|
else ()
|
||||||
# Try to get system installed version
|
# Try to get system installed version
|
||||||
find_package(nlohmann_json QUIET)
|
find_package(nlohmann_json QUIET)
|
||||||
@ -100,6 +105,15 @@ else ()
|
|||||||
)
|
)
|
||||||
list(APPEND fetch_packages nlohmann_json)
|
list(APPEND fetch_packages nlohmann_json)
|
||||||
endif ()
|
endif ()
|
||||||
|
find_package(CLI11 QUIET)
|
||||||
|
if (NOT CLI11_FOUND)
|
||||||
|
# If failed fetch the desired version
|
||||||
|
FetchContent_Declare(CLI11
|
||||||
|
GIT_REPOSITORY https://github.com/CLIUtils/CLI11
|
||||||
|
GIT_TAG v2.3.2
|
||||||
|
)
|
||||||
|
list(APPEND fetch_packages nlohmann_json CLI11)
|
||||||
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
# Handle configure flags
|
# Handle configure flags
|
||||||
@ -141,6 +155,12 @@ set_target_properties(nlohmann_json_schema_validator PROPERTIES
|
|||||||
# OUTPUT_NAME nlohmann_json_validator
|
# OUTPUT_NAME nlohmann_json_validator
|
||||||
)
|
)
|
||||||
|
|
||||||
|
add_executable(nlohmann_json_schema_validator_cli)
|
||||||
|
set_target_properties(nlohmann_json_schema_validator_cli PROPERTIES
|
||||||
|
EXPORT_NAME cli
|
||||||
|
OUTPUT_NAME json-validator
|
||||||
|
)
|
||||||
|
|
||||||
# Main definitions in here
|
# Main definitions in here
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
|||||||
@ -6,13 +6,19 @@ target_sources(nlohmann_json_schema_validator PRIVATE
|
|||||||
json-patch.cpp
|
json-patch.cpp
|
||||||
string-format-check.cpp
|
string-format-check.cpp
|
||||||
)
|
)
|
||||||
|
target_sources(nlohmann_json_schema_validator_cli PRIVATE
|
||||||
|
cli.cpp)
|
||||||
|
configure_file(nlohmann/json-schema.hpp.in nlohmann/json-schema.hpp)
|
||||||
|
|
||||||
target_include_directories(nlohmann_json_schema_validator PUBLIC
|
target_include_directories(nlohmann_json_schema_validator PUBLIC
|
||||||
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
|
||||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
|
||||||
|
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
||||||
)
|
)
|
||||||
|
|
||||||
set_target_properties(nlohmann_json_schema_validator PROPERTIES
|
set_target_properties(nlohmann_json_schema_validator PROPERTIES
|
||||||
PUBLIC_HEADER nlohmann/json-schema.hpp)
|
PUBLIC_HEADER ${CMAKE_CURRENT_BINARY_DIR}/nlohmann/json-schema.hpp)
|
||||||
|
target_link_libraries(nlohmann_json_schema_validator_cli PRIVATE
|
||||||
|
nlohmann_json_schema_validator CLI11::CLI11)
|
||||||
|
|
||||||
# TODO: Why would this need to be if guarded?
|
# TODO: Why would this need to be if guarded?
|
||||||
if (JSON_VALIDATOR_SHARED_LIBS)
|
if (JSON_VALIDATOR_SHARED_LIBS)
|
||||||
|
|||||||
67
src/cli.cpp
Normal file
67
src/cli.cpp
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#include <CLI/App.hpp>
|
||||||
|
#include <CLI/Config.hpp>
|
||||||
|
#include <CLI/Formatter.hpp>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "nlohmann/json-schema.hpp"
|
||||||
|
|
||||||
|
using namespace nlohmann;
|
||||||
|
using namespace nlohmann::json_schema;
|
||||||
|
|
||||||
|
class main_cli : public CLI::App
|
||||||
|
{
|
||||||
|
std::string version;
|
||||||
|
std::ifstream schema_input;
|
||||||
|
std::filesystem::path object_path;
|
||||||
|
// TODO: Export this as a built-in loader
|
||||||
|
void loader(const json_uri &uri, json &sch)
|
||||||
|
{
|
||||||
|
std::string filename = object_path.parent_path().append(uri.path());
|
||||||
|
std::ifstream lf(filename);
|
||||||
|
if (!lf.good())
|
||||||
|
throw std::invalid_argument("could not open " + uri.url() + " tried with " + filename);
|
||||||
|
try {
|
||||||
|
lf >> sch;
|
||||||
|
} catch (const std::exception &e) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
json schema;
|
||||||
|
json object;
|
||||||
|
json_validator validator;
|
||||||
|
main_cli()
|
||||||
|
: CLI::App{"Json schema validator", "json-validator"},
|
||||||
|
validator{
|
||||||
|
[this](const json_uri &u, json &s) { this->loader(u, s); },
|
||||||
|
default_string_format_check},
|
||||||
|
version{nlohmann::json_schema::version}
|
||||||
|
{
|
||||||
|
set_version_flag("--version", version);
|
||||||
|
add_option("schema", schema_input, "JSON schema of the object")
|
||||||
|
->check(CLI::ExistingFile);
|
||||||
|
add_option("object", object_path, "JSON object to validate")
|
||||||
|
->check(CLI::ExistingFile);
|
||||||
|
}
|
||||||
|
void validate()
|
||||||
|
{
|
||||||
|
validator.set_root_schema(schema);
|
||||||
|
validator.validate(object);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
main_cli app{};
|
||||||
|
|
||||||
|
try {
|
||||||
|
app.parse(argc, argv);
|
||||||
|
} catch (const CLI::ParseError &e) {
|
||||||
|
return app.exit(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
app.validate();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -128,6 +128,8 @@ public:
|
|||||||
namespace json_schema
|
namespace json_schema
|
||||||
{
|
{
|
||||||
|
|
||||||
|
constexpr std::string_view version = "@PROJECT_VERSION@";
|
||||||
|
|
||||||
extern json draft7_schema_builtin;
|
extern json draft7_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;
|
||||||
Loading…
Reference in New Issue
Block a user