summaryrefslogtreecommitdiffstats
path: root/logic/MMCJson.h
diff options
context:
space:
mode:
Diffstat (limited to 'logic/MMCJson.h')
-rw-r--r--logic/MMCJson.h50
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);
+ }
+}
}