From cb5b83ebcda46847007536306c4218826a733ac9 Mon Sep 17 00:00:00 2001
From: Patrick Boettcher
Date: Wed, 5 Aug 2020 09:31:34 +0200
Subject: [PATCH] add simple format-callback-example
Addresses #129
---
CMakeLists.txt | 3 +++
app/format.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 57 insertions(+)
create mode 100644 app/format.cpp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c428491..3f19480 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -155,6 +155,9 @@ if (BUILD_EXAMPLES)
add_executable(readme-json-schema app/readme.cpp)
target_link_libraries(readme-json-schema nlohmann_json_schema_validator)
+ add_executable(format-json-schema app/format.cpp)
+ target_link_libraries(format-json-schema nlohmann_json_schema_validator)
+
install(TARGETS json-schema-validate readme-json-schema
DESTINATION bin)
endif()
diff --git a/app/format.cpp b/app/format.cpp
new file mode 100644
index 0000000..40e6445
--- /dev/null
+++ b/app/format.cpp
@@ -0,0 +1,54 @@
+#include
+
+#include
+
+using nlohmann::json;
+using nlohmann::json_schema::json_validator;
+
+// The schema is defined based upon a string literal
+static json uri_schema = R"(
+{
+ "$schema": "http://json-schema.org/draft-07/schema#",
+ "type": "object",
+ "properties": {
+ "myUri": {
+ "type":"string",
+ "format": "uri"
+ }
+ }
+})"_json;
+
+// The people are defined with brace initialization
+static json good_uri = {{"myUri", "http://hostname.com/"}};
+static json bad_uri = {{"myUri", "http:/hostname.com/"}};
+
+static void uri_format_checker(const std::string &format, const std::string &value)
+{
+ if (format == "uri") {
+ if (value.find("://") == std::string::npos)
+ throw std::invalid_argument("URI does not contain :// - invalid");
+ } else
+ throw std::logic_error("Don't know how to validate " + format);
+}
+
+int main()
+{
+ json_validator validator(nullptr, uri_format_checker); // create validator
+
+ try {
+ validator.set_root_schema(uri_schema); // insert root-schema
+ } catch (const std::exception &e) {
+ std::cerr << "Validation of schema failed, here is why: " << e.what() << "\n";
+ return EXIT_FAILURE;
+ }
+
+ validator.validate(good_uri);
+
+ try {
+ validator.validate(bad_uri);
+ } catch (const std::exception &e) {
+ std::cerr << "Validation expectedly failed, here is why: " << e.what() << "\n";
+ }
+
+ return EXIT_SUCCESS;
+}