Add workaround for parsing glTF schemas
diff --git a/examples/validator/app/tinygltf-validate.cc b/examples/validator/app/tinygltf-validate.cc
index 055f19b..def5577 100644
--- a/examples/validator/app/tinygltf-validate.cc
+++ b/examples/validator/app/tinygltf-validate.cc
@@ -34,7 +34,8 @@
static void usage(const char *name)
{
- std::cerr << "Usage: " << name << " <schema> < <document>\n";
+ std::cerr << "Usage: " << name << " <gltf file> <gltf schema dir>\n";
+ std::cerr << " schema dir : $glTF/specification/2.0/schema\n";
exit(EXIT_FAILURE);
}
@@ -45,6 +46,7 @@
assert(r.undefined_refs.size() == 0);
#endif
+#if 0
static void loader(const json_uri &uri, json &schema)
{
std::fstream lf("." + uri.path());
@@ -57,17 +59,17 @@
throw e;
}
}
+#endif
-int main(int argc, char *argv[])
+bool validate(const std::string &schema_dir, const std::string &filename)
{
- if (argc != 2)
- usage(argv[0]);
+ std::string gltf_schema = schema_dir + "/glTF.schema.json";
- std::fstream f(argv[1]);
+ std::fstream f(gltf_schema);
if (!f.good()) {
- std::cerr << "could not open " << argv[1] << " for reading\n";
- usage(argv[0]);
- }
+ 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;
@@ -75,11 +77,24 @@
f >> schema;
} catch (std::exception &e) {
std::cerr << e.what() << " at " << f.tellp() << " - while parsing the schema\n";
- return EXIT_FAILURE;
+ return false;
}
// 2) create the validator and
- json_validator validator(loader, [](const std::string &, const std::string &) {});
+ 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
@@ -93,16 +108,33 @@
// 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 {
- std::cin >> document;
+ d >> document;
validator.validate(document);
} catch (std::exception &e) {
std::cerr << "schema validation failed\n";
- std::cerr << e.what() << " at offset: " << std::cin.tellg() << "\n";
- return EXIT_FAILURE;
+ std::cerr << e.what() << " at offset: " << d.tellg() << "\n";
+ return false;
}
std::cerr << "document is valid\n";
- return EXIT_SUCCESS;
+ 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;
}
diff --git a/examples/validator/src/json-uri.cpp b/examples/validator/src/json-uri.cpp
index e480fce..2dc6113 100644
--- a/examples/validator/src/json-uri.cpp
+++ b/examples/validator/src/json-uri.cpp
@@ -86,8 +86,11 @@
auto path = url.substr(pos);
if (path[0] == '/') // if it starts with a / it is root-path
path_ = path;
- else // otherwise it is a subfolder
- path_.append(path);
+ else { // otherwise it is a subfolder
+ // HACK(syoyo): Force append '/' for glTF json schemas
+ path_ = path;
+ //path_.append(path);
+ }
pointer_ = json_pointer("");
}
diff --git a/examples/validator/src/json-validator.cpp b/examples/validator/src/json-validator.cpp
index cb26ca2..3358805 100644
--- a/examples/validator/src/json-validator.cpp
+++ b/examples/validator/src/json-validator.cpp
@@ -278,7 +278,9 @@
// check whether all schema-references are new
for (auto &sref : r.schema_refs) {
if (schema_refs_.find(sref.first) != schema_refs_.end())
- throw std::invalid_argument("schema " + sref.first.to_string() + " already present in validator.");
+ // HACK(syoyo): Skip duplicated schema.
+ break;
+ //throw std::invalid_argument("schema " + sref.first.to_string() + " already present in validator.");
}
// no undefined references and no duplicated schema - store the schema
schema_store_.push_back(schema);