diff options
-rw-r--r-- | CMakeLists.txt | 4 | ||||
-rw-r--r-- | jobs/apigen.yaml | 54 | ||||
-rw-r--r-- | jobs/converters.h | 88 | ||||
-rw-r--r-- | jobs/preamble.mustache | 18 | ||||
-rw-r--r-- | jobs/{{base}}.cpp.mustache | 75 | ||||
-rw-r--r-- | jobs/{{base}}.h.mustache | 65 |
6 files changed, 303 insertions, 1 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a345e06..4bf47f71 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -85,7 +85,9 @@ set(libqmatrixclient_SRCS set(example_SRCS examples/qmc-example.cpp) -add_library(qmatrixclient ${libqmatrixclient_SRCS}) +file (STRINGS jobs/generated/apifiles.txt libqmatrixclient_job_SRCS REGEX "\\.cpp$") + +add_library(qmatrixclient ${libqmatrixclient_SRCS} ${libqmatrixclient_job_SRCS}) set_property(TARGET qmatrixclient PROPERTY VERSION "0.0.0") set_property(TARGET qmatrixclient PROPERTY SOVERSION 0 ) diff --git a/jobs/apigen.yaml b/jobs/apigen.yaml new file mode 100644 index 00000000..7ae1de81 --- /dev/null +++ b/jobs/apigen.yaml @@ -0,0 +1,54 @@ +env: + preamble: preamble.mustache + copyrightName: Kitsune Ral + copyrightEmail: <kitsune-ral@users.sf.net> + imports: { set: } + returnFile?: { bool: false } + +templates: +- "{{base}}.h.mustache" +- "{{base}}.cpp.mustache" + +outFilesList: apifiles.txt + +# Structure: +# swaggerType: <targetTypeSpec> +# OR +# swaggerType: +# - swaggerFormat: <targetTypeSpec> +# - /swaggerFormatRegEx/: <targetTypeSpec> +# - //: <targetTypeSpec> # default, if the format doesn't mach anything above +# WHERE +# targetTypeSpec = targetType OR +# { type: targetType, imports: <filename OR [ filenames... ]>, <other attributes...> } +types: + integer: + - int64: qint64 + - int32: qint32 + - //: int + number: + - float: float + - double: double + boolean: bool + string: + - /byte|binary/: { type: QByteArray, imports: <QtCore/QByteArray> } + - date: + type: QDate + avoidCopy?: true + imports: <QtCore/QDate> + - dateTime: + type: QDateTime + avoidCopy?: true + imports: <QtCore/QDateTime> + - //: { type: QString, imports: <QtCore/QString> } + file: + type: QByteArray + imports: <QtCore/QByteArray> + returnFile?: true + name: data + "[]": { type: "QVector<{{type}}>", imports: <QtCore/QVector> } + "{}": + type: "QHash<QString, {{type}}>" + imports: [ <QtCore/QHash>, <QtCore/QString> ] + +operations:
\ No newline at end of file diff --git a/jobs/converters.h b/jobs/converters.h new file mode 100644 index 00000000..b52cfaa2 --- /dev/null +++ b/jobs/converters.h @@ -0,0 +1,88 @@ +/****************************************************************************** +* Copyright (C) 2017 Kitsune Ral <kitsune-ral@users.sf.net> +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +#include <QtCore/QJsonValue> +#include <QtCore/QJsonArray> +#include <QtCore/QDate> + +namespace QMatrixClient +{ + template <typename T> + inline QJsonValue toJson(T val) + { + return QJsonValue(val); + } + + template <typename T> + inline QJsonValue toJson(const QVector<T>& vals) + { + QJsonArray ar; + std::copy(vals.begin(), vals.end(), std::back_inserter(ar)); + return ar; + } + + inline QJsonValue toJson(const QStringList& strings) + { + return QJsonArray::fromStringList(strings); + } + + template <typename T> + inline T fromJson(const QJsonValue& jv) + { + return QVariant(jv).value<T>(); + } + + template <> + inline int fromJson<int>(const QJsonValue& jv) + { + return jv.toInt(); + } + + template <> + inline qint64 fromJson<qint64>(const QJsonValue& jv) + { + return static_cast<qint64>(jv.toDouble()); + } + + template <> + inline double fromJson<double>(const QJsonValue& jv) + { + return jv.toDouble(); + } + + template <> + inline QString fromJson<QString>(const QJsonValue& jv) + { + return jv.toString(); + } + + template <> + inline QDateTime fromJson<QDateTime>(const QJsonValue& jv) + { + return QDateTime::fromMSecsSinceEpoch(fromJson<qint64>(jv), Qt::UTC); + } + + template <> + inline QDate fromJson<QDate>(const QJsonValue& jv) + { + return QDateTime::fromMSecsSinceEpoch( + fromJson<qint64>(jv), Qt::UTC).date(); + } +} // namespace QMatrixClient
\ No newline at end of file diff --git a/jobs/preamble.mustache b/jobs/preamble.mustache new file mode 100644 index 00000000..f14d58d2 --- /dev/null +++ b/jobs/preamble.mustache @@ -0,0 +1,18 @@ +/****************************************************************************** +* Copyright (C) 2016-2017 {{copyrightName}} {{copyrightEmail}} +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + diff --git a/jobs/{{base}}.cpp.mustache b/jobs/{{base}}.cpp.mustache new file mode 100644 index 00000000..05c865b3 --- /dev/null +++ b/jobs/{{base}}.cpp.mustache @@ -0,0 +1,75 @@ +{{#@filePartial}}preamble{{/@filePartial}} + +#include "{{filenameBase}}.h" + +{{#operations}} +#include "../converters.h" + +#include <QtCore/QStringBuilder> + +using namespace QMatrixClient; + + {{#returns?}} +class {{#@cap}}{{operationId}}{{/@cap}}Job::Private +{ + public: + {{#returns}} + {{type}} {{name}}; + {{/returns}} +}; + {{/returns?}} + + {{#operation}} +{{#@cap}}{{operationId}}{{/@cap}}Job::{{#@cap}}{{operationId}}{{/@cap}}Job(const ConnectionData* connection{{#allParams}}, {{!}} + {{#avoidCopy?}}const {{dataType}}&{{/avoidCopy?}} + {{^avoidCopy?}}{{dataType}}{{/avoidCopy?}} {{paramName}} + {{/allParams}}) + : BaseJob(connection, HttpVerb::{{#@cap}}{{#@tolower}}{{httpMethod}}{{/@tolower}}{{/@cap}}, "{{#@cap}}{{operationId}}{{/@cap}}Job" + , {{#pathParts}}{{part}}{{#hasMore}} % {{/hasMore}}{{/pathParts}} + , Query { {{#queryParams}} + { "{{baseName}}", toJson({{paramName}}).toString() }{{#hasMore}}, {{/hasMore}} + {{/queryParams}} } + , Data { {{#bodyParams}} + { "{{baseName}}", toJson({{paramName}}) }{{#hasMore}}, {{/hasMore}} + {{/bodyParams}} } + {{#skipAuth}}, false{{/skipAuth}} + ){{#returns?}}, d(new Private){{/returns?}} +{ } + {{/operation}} + + {{#returns?}} +{{className}}Job::~{{className}}Job() +{ + delete d; +} + + {{#returns}} +{{type}} {{className}}Job::{{name}}() const +{ + return d->{{name}}; +} + {{/returns}} + + {{#returnFile?}} +BaseJob::Status {{className}}Job::parseReply(QByteArray data) +{ + {{#returns}}{{name}}{{/returns}} = data; + return Success; +} + {{/returnFile?}} + {{^returnFile?}} +BaseJob::Status {{className}}Job::parseJson(const QJsonDocument& data) +{ + auto json = data.object(); + {{#returns}} + {{#required?}} + if (!json.contains("{{name}}") + return { JsonParseError, "{{name}} not found in the response" }; + {{/required?}} + d->{{name}} = fromJson<{{type}}>(json.value("{{name}}")); + {{/returns}} + return Success; +} + {{/returnFile?}} + {{/returns?}} +{{/operations}} diff --git a/jobs/{{base}}.h.mustache b/jobs/{{base}}.h.mustache new file mode 100644 index 00000000..6fb9caef --- /dev/null +++ b/jobs/{{base}}.h.mustache @@ -0,0 +1,65 @@ +{{#@filePartial}}preamble{{/@filePartial}} + +#pragma once + +{{#operations}} +#include "../basejob.h" +{{/operations}} + +{{#imports}} +#include {{.}} +{{/imports}} + +{{#models}} +#include <QtCore/QJsonValue> {{! FIXME: This should probably go inside imports }} +{{/models}} + +namespace QMatrixClient +{ +{{#models}} + // Data structures + {{#model}} + struct {{classname}} + { + {{#vars}} + {{datatype}} {{name}}; + {{/vars}} + operator QJsonValue() const { return {}; } + }; + {{/model}} +{{/models}} +{{#operations}} + // Operations + {{#operation}} + class {{#@cap}}{{operationId}}{{/@cap}}Job : public BaseJob + { + public: + {{#@cap}}{{operationId}}{{/@cap}}Job(const ConnectionData* connection + {{#allParams}} + , {{!}} + {{#avoidCopy?}}const {{dataType}}&{{/avoidCopy?}} + {{^avoidCopy?}}{{dataType}}{{/avoidCopy?}} {{paramName}} + {{/allParams}}); + {{#returns?}} + virtual {{className}}Job(); + + {{#returns}} + {{type}} {{name}}() const; + {{/returns}} + + protected: + {{#returnFile?}} + Status parseReply(QByteArray data) override; + {{/returnFile?}} + {{^returnFile}} + Status parseJson(const JsonDocument& data) override; + {{/returnFile}} + + private: + class Private; + Private* d; + {{/returns?}} + }; + {{/operation}} +{{/operations}} +} // namespace QMatrixClient |