diff options
Diffstat (limited to 'logic/MMCJson.h')
-rw-r--r-- | logic/MMCJson.h | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/logic/MMCJson.h b/logic/MMCJson.h index 8408f29b..dc0b4224 100644 --- a/logic/MMCJson.h +++ b/logic/MMCJson.h @@ -9,17 +9,29 @@ #include <QJsonObject> #include <QJsonDocument> #include <QJsonArray> +#include <QFile> +#include <memory> #include "MMCError.h" class JSONValidationError : public MMCError { public: - JSONValidationError(QString cause) : MMCError(cause) {}; - virtual ~JSONValidationError() noexcept {} + JSONValidationError(QString cause) : MMCError(cause) {} +}; +class FileOpenError : public MMCError +{ +public: + FileOpenError(const QFile &file) : MMCError(QObject::tr("Error opening %1: %2").arg(file.fileName(), file.errorString())) {} }; namespace MMCJson { +/// parses the data into a json document. throws if there's a parse error +QJsonDocument parseDocument(const QByteArray &data, const QString &what); + +/// tries to open and then parses the specified file. throws if there's an error +QJsonDocument parseFile(const QString &filename, const QString &what); + /// make sure the value exists. throw otherwise. QJsonValue ensureExists(QJsonValue val, const QString what = "value"); @@ -27,39 +39,63 @@ QJsonValue ensureExists(QJsonValue val, const QString what = "value"); QJsonObject ensureObject(const QJsonValue val, const QString what = "value"); /// make sure the document is converted into an object. throw otherwise. -QJsonObject ensureObject(const QJsonDocument val, const QString what = "value"); +QJsonObject ensureObject(const QJsonDocument val, const QString what = "document"); /// make sure the value is converted into an array. throw otherwise. QJsonArray ensureArray(const QJsonValue val, QString what = "value"); +/// make sure the document is converted into an array. throw otherwise. +QJsonArray ensureArray(const QJsonDocument &val, const QString &what = "document"); + /// make sure the value is converted into a string. throw otherwise. QString ensureString(const QJsonValue val, QString what = "value"); +/// make sure the value is converted into a string that's parseable as an url. throw otherwise. +QUrl ensureUrl(const QJsonValue &val, const QString &what = "value"); + /// make sure the value is converted into a boolean. throw otherwise. bool ensureBoolean(const QJsonValue val, QString what = "value"); /// make sure the value is converted into an integer. throw otherwise. int ensureInteger(const QJsonValue val, QString what = "value"); +/// make sure the value is converted into an integer. throw otherwise. this version will return the default value if the field is undefined. +int ensureInteger(const QJsonValue val, QString what, const int def); + /// make sure the value is converted into a double precision floating number. throw otherwise. double ensureDouble(const QJsonValue val, QString what = "value"); +QStringList ensureStringList(const QJsonValue val, QString what); + void writeString(QJsonObject & to, QString key, QString value); -void writeStringList (QJsonObject & to, QString key, QStringList values); +void writeStringList(QJsonObject & to, QString key, QStringList values); template <typename T> -void writeObjectList (QJsonObject & to, QString key, QList<T> values) +void writeObjectList(QJsonObject & to, QString key, QList<std::shared_ptr<T>> values) { - if(values.size()) + if (!values.isEmpty()) { QJsonArray array; - for(auto value: values) + for (auto value: values) { array.append(value->toJson()); } to.insert(key, array); } } +template <typename T> +void writeObjectList(QJsonObject & to, QString key, QList<T> values) +{ + if (!values.isEmpty()) + { + QJsonArray array; + for (auto value: values) + { + array.append(value.toJson()); + } + to.insert(key, array); + } +} } |