#pragma once #include #include #include #include // JSON-Schema includes #include #include #include #include #include #include class QJsonFactory { public: static int load(const QString& schema, const QString& config, QJsonObject& json) { // Load the schema and the config trees QJsonObject schemaTree = readSchema(schema); QJsonObject configTree = readConfig(config); // create the validator QJsonSchemaChecker schemaChecker; schemaChecker.setSchema(schemaTree); bool valid = schemaChecker.validate(configTree); for (std::list::const_iterator i = schemaChecker.getMessages().begin(); i != schemaChecker.getMessages().end(); ++i) { std::cout << *i << std::endl; } if (!valid) { std::cerr << "Validation failed for configuration file: " << config.toStdString() << std::endl; return -3; } json = configTree; return 0; } static QJsonObject readConfig(const QString& path) { QFile file(path); QJsonParseError error; if (!file.open(QIODevice::ReadOnly)) { std::stringstream sstream; sstream << "Configuration file not found: '" << path.toStdString() << "' (" << file.errorString().toStdString() << ")"; throw std::runtime_error(sstream.str()); } QString config = QString(file.readAll()); config.remove(QRegularExpression("([^:]?\\/\\/.*)")); QJsonDocument doc = QJsonDocument::fromJson(config.toUtf8(), &error); file.close(); if (error.error != QJsonParseError::NoError) { // report to the user the failure and their locations in the document. int errorLine(0), errorColumn(0); for( int i=0, count=qMin( error.offset,config.size()); i