| /* |
| * Modern C++ JSON schema validator |
| * |
| * Licensed under the MIT License <http://opensource.org/licenses/MIT>. |
| * |
| * Copyright (c) 2016 Patrick Boettcher <patrick.boettcher@posteo.de>. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom |
| * the Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included in |
| * all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN |
| * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
| * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT |
| * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR |
| * THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| #include <json-schema.hpp> |
| |
| #include <fstream> |
| #include <iostream> |
| |
| using nlohmann::json; |
| using nlohmann::json_uri; |
| using nlohmann::json_schema_draft4::json_validator; |
| |
| static void usage(const char *name) |
| { |
| std::cerr << "Usage: " << name << " <gltf file> <gltf schema dir>\n"; |
| std::cerr << " schema dir : $glTF/specification/2.0/schema\n"; |
| exit(EXIT_FAILURE); |
| } |
| |
| #if 0 |
| resolver r(nlohmann::json_schema_draft4::root_schema, |
| nlohmann::json_schema_draft4::root_schema["id"]); |
| schema_refs_.insert(r.schema_refs.begin(), r.schema_refs.end()); |
| assert(r.undefined_refs.size() == 0); |
| #endif |
| |
| #if 0 |
| static void loader(const json_uri &uri, json &schema) |
| { |
| std::fstream lf("." + uri.path()); |
| if (!lf.good()) |
| throw std::invalid_argument("could not open " + uri.url() + " tried with " + uri.path()); |
| |
| try { |
| lf >> schema; |
| } catch (std::exception &e) { |
| throw e; |
| } |
| } |
| #endif |
| |
| bool validate(const std::string &schema_dir, const std::string &filename) |
| { |
| std::string gltf_schema = schema_dir + "/glTF.schema.json"; |
| |
| std::fstream f(gltf_schema); |
| if (!f.good()) { |
| std::cerr << "could not open " << gltf_schema << " for reading\n"; |
| return false; |
| } |
| |
| // 1) Read the schema for the document you want to validate |
| json schema; |
| try { |
| f >> schema; |
| } catch (std::exception &e) { |
| std::cerr << e.what() << " at " << f.tellp() << " - while parsing the schema\n"; |
| return false; |
| } |
| |
| // 2) create the validator and |
| json_validator validator([&schema_dir](const json_uri &uri, json &schema) { |
| std::cout << "uri.url : " << uri.url() << std::endl; |
| std::cout << "uri.path : " << uri.path() << std::endl; |
| |
| std::fstream lf(schema_dir + "/" + uri.path()); |
| if (!lf.good()) |
| throw std::invalid_argument("could not open " + uri.url() + " tried with " + uri.path()); |
| |
| try { |
| lf >> schema; |
| } catch (std::exception &e) { |
| throw e; |
| } |
| }, [](const std::string &, const std::string &) {}); |
| |
| try { |
| // insert this schema as the root to the validator |
| // this resolves remote-schemas, sub-schemas and references via the given loader-function |
| validator.set_root_schema(schema); |
| } catch (std::exception &e) { |
| std::cerr << "setting root schema failed\n"; |
| std::cerr << e.what() << "\n"; |
| } |
| |
| // 3) do the actual validation of the document |
| json document; |
| |
| std::fstream d(filename); |
| if (!d.good()) { |
| std::cerr << "could not open " << filename << " for reading\n"; |
| return false; |
| } |
| |
| try { |
| d >> document; |
| validator.validate(document); |
| } catch (std::exception &e) { |
| std::cerr << "schema validation failed\n"; |
| std::cerr << e.what() << " at offset: " << d.tellg() << "\n"; |
| return false; |
| } |
| |
| std::cerr << "document is valid\n"; |
| |
| return true; |
| |
| } |
| |
| int main(int argc, char *argv[]) |
| { |
| if (argc != 3) |
| usage(argv[0]); |
| |
| bool ret = validate(argv[1], argv[2]); |
| |
| return ret ? EXIT_SUCCESS : EXIT_FAILURE; |
| } |