diff options
Diffstat (limited to 'lib')
29 files changed, 224 insertions, 265 deletions
diff --git a/lib/converters.h b/lib/converters.h index fb1da6d7..916124a6 100644 --- a/lib/converters.h +++ b/lib/converters.h @@ -45,6 +45,47 @@ namespace std namespace QMatrixClient { + struct NoneTag {}; + constexpr NoneTag none {}; + + /** A crude substitute for `optional` while we're not C++17 + * + * Only works with default-constructible types. + */ + template <typename T> + class Omittable + { + public: + explicit Omittable() : Omittable(none) { } + Omittable(NoneTag) : _omitted(true) { } + Omittable(const T& val) : _value(val), _omitted(false) { } + Omittable(T&& val) : _value(std::move(val)), _omitted(false) { } + Omittable<T>& operator=(const T& val) + { + _value = val; + _omitted = false; + return *this; + } + Omittable<T>& operator=(T&& val) + { + _value = std::move(val); + _omitted = false; + return *this; + } + + bool omitted() const { return _omitted; } + const T& value() const { return _value; } + T& value() { return _value; } + T&& release() { _omitted = true; return std::move(value); } + + operator bool() const { return !_omitted; } + + private: + T _value; + bool _omitted; + }; + + // This catches anything implicitly convertible to QJsonValue/Object/Array inline QJsonValue toJson(const QJsonValue& val) { return val; } inline QJsonObject toJson(const QJsonObject& o) { return o; } @@ -99,6 +140,16 @@ namespace QMatrixClient return json; } + template <typename T> + inline auto toJson(const Omittable<T>& omittable) + -> decltype(toJson(omittable.value())) + { + if (omittable) + return toJson(omittable.value()); + + return {}; + } + #if 0 template <typename T> inline auto toJson(const optional<T>& optVal) @@ -287,16 +338,4 @@ namespace QMatrixClient _impl::AddNode<std::conditional_t<Force, QJsonValue, decltype(json)>> ::impl(o, std::move(key), std::move(json)); } - - /** Construct an "omitted" value of a given type - * This is a workaround for the time being while we're not C++17 and - * cannot use `optional`. - */ - template <typename T> - inline T omitted() - { - T val; - val.omitted = true; - return val; - } } // namespace QMatrixClient diff --git a/lib/csapi/admin.h b/lib/csapi/admin.h index e57c6cfe..087eabf0 100644 --- a/lib/csapi/admin.h +++ b/lib/csapi/admin.h @@ -6,9 +6,9 @@ #include "jobs/basejob.h" +#include <QtCore/QVector> #include <QtCore/QHash> #include "converters.h" -#include <QtCore/QVector> namespace QMatrixClient { @@ -22,7 +22,7 @@ namespace QMatrixClient struct ConnectionInfo { QString ip; - qint64 lastSeen; + Omittable<qint64> lastSeen; QString userAgent; }; diff --git a/lib/csapi/administrative_contact.cpp b/lib/csapi/administrative_contact.cpp index 7c6c4141..14079179 100644 --- a/lib/csapi/administrative_contact.cpp +++ b/lib/csapi/administrative_contact.cpp @@ -72,9 +72,6 @@ namespace QMatrixClient QJsonObject toJson(const Post3PIDsJob::ThreePidCredentials& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<>(_json, "client_secret", pod.clientSecret); addToJson<>(_json, "id_server", pod.idServer); addToJson<>(_json, "sid", pod.sid); diff --git a/lib/csapi/administrative_contact.h b/lib/csapi/administrative_contact.h index 2fbf5c0a..57d11d34 100644 --- a/lib/csapi/administrative_contact.h +++ b/lib/csapi/administrative_contact.h @@ -59,8 +59,6 @@ namespace QMatrixClient QString clientSecret; QString idServer; QString sid; - - bool omitted; }; // Construction/destruction diff --git a/lib/csapi/content-repo.cpp b/lib/csapi/content-repo.cpp index 95fc5aed..101f0ee9 100644 --- a/lib/csapi/content-repo.cpp +++ b/lib/csapi/content-repo.cpp @@ -156,7 +156,7 @@ class GetContentThumbnailJob::Private QIODevice* content; }; -BaseJob::Query queryToGetContentThumbnail(int width, int height, const QString& method) +BaseJob::Query queryToGetContentThumbnail(Omittable<int> width, Omittable<int> height, const QString& method) { BaseJob::Query _q; _q.addQueryItem("width", QString("%1").arg(width)); @@ -166,14 +166,14 @@ BaseJob::Query queryToGetContentThumbnail(int width, int height, const QString& return _q; } -QUrl GetContentThumbnailJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, int width, int height, const QString& method) +QUrl GetContentThumbnailJob::makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, Omittable<int> width, Omittable<int> height, const QString& method) { return BaseJob::makeRequestUrl(std::move(baseUrl), basePath % "/thumbnail/" % serverName % "/" % mediaId, queryToGetContentThumbnail(width, height, method)); } -GetContentThumbnailJob::GetContentThumbnailJob(const QString& serverName, const QString& mediaId, int width, int height, const QString& method) +GetContentThumbnailJob::GetContentThumbnailJob(const QString& serverName, const QString& mediaId, Omittable<int> width, Omittable<int> height, const QString& method) : BaseJob(HttpVerb::Get, "GetContentThumbnailJob", basePath % "/thumbnail/" % serverName % "/" % mediaId, queryToGetContentThumbnail(width, height, method), @@ -205,11 +205,11 @@ BaseJob::Status GetContentThumbnailJob::parseReply(QNetworkReply* reply) class GetUrlPreviewJob::Private { public: - qint64 matrixImageSize; + Omittable<qint64> matrixImageSize; QString ogImage; }; -BaseJob::Query queryToGetUrlPreview(const QString& url, qint64 ts) +BaseJob::Query queryToGetUrlPreview(const QString& url, Omittable<qint64> ts) { BaseJob::Query _q; _q.addQueryItem("url", url); @@ -217,14 +217,14 @@ BaseJob::Query queryToGetUrlPreview(const QString& url, qint64 ts) return _q; } -QUrl GetUrlPreviewJob::makeRequestUrl(QUrl baseUrl, const QString& url, qint64 ts) +QUrl GetUrlPreviewJob::makeRequestUrl(QUrl baseUrl, const QString& url, Omittable<qint64> ts) { return BaseJob::makeRequestUrl(std::move(baseUrl), basePath % "/preview_url", queryToGetUrlPreview(url, ts)); } -GetUrlPreviewJob::GetUrlPreviewJob(const QString& url, qint64 ts) +GetUrlPreviewJob::GetUrlPreviewJob(const QString& url, Omittable<qint64> ts) : BaseJob(HttpVerb::Get, "GetUrlPreviewJob", basePath % "/preview_url", queryToGetUrlPreview(url, ts)) @@ -234,7 +234,7 @@ GetUrlPreviewJob::GetUrlPreviewJob(const QString& url, qint64 ts) GetUrlPreviewJob::~GetUrlPreviewJob() = default; -qint64 GetUrlPreviewJob::matrixImageSize() const +Omittable<qint64> GetUrlPreviewJob::matrixImageSize() const { return d->matrixImageSize; } diff --git a/lib/csapi/content-repo.h b/lib/csapi/content-repo.h index 63a55c8f..8d73dc51 100644 --- a/lib/csapi/content-repo.h +++ b/lib/csapi/content-repo.h @@ -6,6 +6,7 @@ #include "jobs/basejob.h" +#include "converters.h" #include <QtCore/QIODevice> namespace QMatrixClient @@ -89,14 +90,14 @@ namespace QMatrixClient class GetContentThumbnailJob : public BaseJob { public: - explicit GetContentThumbnailJob(const QString& serverName, const QString& mediaId, int width = {}, int height = {}, const QString& method = {}); + explicit GetContentThumbnailJob(const QString& serverName, const QString& mediaId, Omittable<int> width = none, Omittable<int> height = none, const QString& method = {}); /** Construct a URL out of baseUrl and usual parameters passed to * GetContentThumbnailJob. This function can be used when * a URL for GetContentThumbnailJob is necessary but the job * itself isn't. */ - static QUrl makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, int width = {}, int height = {}, const QString& method = {}); + static QUrl makeRequestUrl(QUrl baseUrl, const QString& serverName, const QString& mediaId, Omittable<int> width = none, Omittable<int> height = none, const QString& method = {}); ~GetContentThumbnailJob() override; @@ -116,20 +117,20 @@ namespace QMatrixClient class GetUrlPreviewJob : public BaseJob { public: - explicit GetUrlPreviewJob(const QString& url, qint64 ts = {}); + explicit GetUrlPreviewJob(const QString& url, Omittable<qint64> ts = none); /** Construct a URL out of baseUrl and usual parameters passed to * GetUrlPreviewJob. This function can be used when * a URL for GetUrlPreviewJob is necessary but the job * itself isn't. */ - static QUrl makeRequestUrl(QUrl baseUrl, const QString& url, qint64 ts = {}); + static QUrl makeRequestUrl(QUrl baseUrl, const QString& url, Omittable<qint64> ts = none); ~GetUrlPreviewJob() override; // Result properties - qint64 matrixImageSize() const; + Omittable<qint64> matrixImageSize() const; const QString& ogImage() const; protected: diff --git a/lib/csapi/create_room.cpp b/lib/csapi/create_room.cpp index 72c8d547..17a9c60f 100644 --- a/lib/csapi/create_room.cpp +++ b/lib/csapi/create_room.cpp @@ -19,9 +19,6 @@ namespace QMatrixClient QJsonObject toJson(const CreateRoomJob::Invite3pid& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<>(_json, "id_server", pod.idServer); addToJson<>(_json, "medium", pod.medium); addToJson<>(_json, "address", pod.address); @@ -31,9 +28,6 @@ namespace QMatrixClient QJsonObject toJson(const CreateRoomJob::StateEvent& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<IfNotEmpty>(_json, "type", pod.type); addToJson<IfNotEmpty>(_json, "state_key", pod.stateKey); addToJson<IfNotEmpty>(_json, "content", pod.content); diff --git a/lib/csapi/create_room.h b/lib/csapi/create_room.h index c5f5edf5..995d5e73 100644 --- a/lib/csapi/create_room.h +++ b/lib/csapi/create_room.h @@ -25,8 +25,6 @@ namespace QMatrixClient QString idServer; QString medium; QString address; - - bool omitted; }; struct StateEvent @@ -34,8 +32,6 @@ namespace QMatrixClient QString type; QString stateKey; QJsonObject content; - - bool omitted; }; // Construction/destruction diff --git a/lib/csapi/event_context.cpp b/lib/csapi/event_context.cpp index d9ab45ca..c7e01391 100644 --- a/lib/csapi/event_context.cpp +++ b/lib/csapi/event_context.cpp @@ -23,21 +23,21 @@ class GetEventContextJob::Private StateEvents state; }; -BaseJob::Query queryToGetEventContext(int limit) +BaseJob::Query queryToGetEventContext(Omittable<int> limit) { BaseJob::Query _q; _q.addQueryItem("limit", QString("%1").arg(limit)); return _q; } -QUrl GetEventContextJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, int limit) +QUrl GetEventContextJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, Omittable<int> limit) { return BaseJob::makeRequestUrl(std::move(baseUrl), basePath % "/rooms/" % roomId % "/context/" % eventId, queryToGetEventContext(limit)); } -GetEventContextJob::GetEventContextJob(const QString& roomId, const QString& eventId, int limit) +GetEventContextJob::GetEventContextJob(const QString& roomId, const QString& eventId, Omittable<int> limit) : BaseJob(HttpVerb::Get, "GetEventContextJob", basePath % "/rooms/" % roomId % "/context/" % eventId, queryToGetEventContext(limit)) diff --git a/lib/csapi/event_context.h b/lib/csapi/event_context.h index 7929c492..0470ba36 100644 --- a/lib/csapi/event_context.h +++ b/lib/csapi/event_context.h @@ -7,6 +7,7 @@ #include "jobs/basejob.h" #include "events/event.h" +#include "converters.h" namespace QMatrixClient { @@ -15,14 +16,14 @@ namespace QMatrixClient class GetEventContextJob : public BaseJob { public: - explicit GetEventContextJob(const QString& roomId, const QString& eventId, int limit = {}); + explicit GetEventContextJob(const QString& roomId, const QString& eventId, Omittable<int> limit = none); /** Construct a URL out of baseUrl and usual parameters passed to * GetEventContextJob. This function can be used when * a URL for GetEventContextJob is necessary but the job * itself isn't. */ - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, int limit = {}); + static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& eventId, Omittable<int> limit = none); ~GetEventContextJob() override; diff --git a/lib/csapi/gtad.yaml b/lib/csapi/gtad.yaml index cb68ad1b..6f9750d0 100644 --- a/lib/csapi/gtad.yaml +++ b/lib/csapi/gtad.yaml @@ -9,111 +9,99 @@ analyzer: origin_server_ts: originServerTimestamp # Instead of originServerTs start: begin # Because start() is a method in BaseJob + # Structure inside `types`: + # - 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...> } + # swaggerType can be @apply/@on pair; attributes from the map under @apply + # are added to each type from the sequence under @on. types: - # 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...> } - integer: - - int64: qint64 - - int32: qint32 - - //: int - number: - - float: float - - //: double - boolean: { type: bool, omitted: false } - string: + - +set: &UseOmittable + useOmittable: + imports: [ '"converters.h"' ] + omittedValue: none # See `none` in converters.h + +on: + - integer: + - int64: qint64 + - int32: qint32 + - //: int + - number: + - float: float + - //: double + - boolean: { type: bool, omittedValue: 'false' } + - string: - byte: &ByteStream type: QIODevice* imports: <QtCore/QIODevice> - binary: *ByteStream - - date: - type: QDate - initializer: QDate::fromString("{{defaultValue}}") - avoidCopy?: true - imports: <QtCore/QDate> - - dateTime: - type: QDateTime - initializer: QDateTime::fromString("{{defaultValue}}") - avoidCopy?: true - imports: <QtCore/QDateTime> - - //: - type: QString - initializer: QStringLiteral("{{defaultValue}}") - string?: true - avoidCopy?: true - file: *ByteStream - object: - - /state_event.yaml$/: - type: StateEventPtr - noCopy?: true - imports: '"events/event.h"' - - /room_event.yaml$/: - type: RoomEventPtr - noCopy?: true - imports: '"events/event.h"' - - /event.yaml$/: - type: EventPtr - noCopy?: true - imports: '"events/event.h"' - - //: - type: QJsonObject - avoidCopy?: true - imports: <QtCore/QJsonObject> - array: - - string: - type: QStringList - avoidCopy?: true - imports: <QtCore/QStringList> - - /^Notification|Result$/: - type: "std::vector<{{1}}>" - noCopy?: true - imports: '"events/event.h"' - - /m\.room\.member$/: - type: "EventsArray<RoomMemberEvent>" - noCopy?: true - imports: '"events/roommemberevent.h"' - - /state_event.yaml$/: - type: StateEvents - noCopy?: true - - /room_event.yaml$/: - type: RoomEvents - noCopy?: true - - /event.yaml$/: - type: Events - noCopy?: true - - /.+/: - type: "QVector<{{1}}>" - avoidCopy?: true - imports: <QtCore/QVector> - - //: { type: QJsonArray, "avoidCopy?": true, imports: <QtCore/QJsonArray> } - map: - - RoomState: - type: "std::unordered_map<QString, {{1}}>" - noCopy?: true - imports: <unordered_map> - - /.+/: - type: "QHash<QString, {{1}}>" - avoidCopy?: true - imports: <QtCore/QHash> - - //: - type: QVariantHash - avoidCopy?: true - imports: '"variant_converters.h"' - variant: - type: QVariant - avoidCopy?: true - imports: '"variant_converters.h"' - schema: # Properties of inline structure definitions - avoidCopy?: true - omitted: omitted<{{dataType.name}}>() - imports: '"converters.h"' + - +set: { "avoidCopy?": true } + +on: + - date: + type: QDate + initializer: QDate::fromString("{{defaultValue}}") + imports: <QtCore/QDate> + - dateTime: + type: QDateTime + initializer: QDateTime::fromString("{{defaultValue}}") + imports: <QtCore/QDateTime> + - //: + type: QString + initializer: QStringLiteral("{{defaultValue}}") + string?: true + - file: *ByteStream + - +set: { "avoidCopy?": true } + +on: + - object: { type: QJsonObject, imports: <QtCore/QJsonObject> } + - $ref: + - /m\.room\.member$/: pass # This $ref is only used in an array, see below + - +set: { "noCopy?": true } + +on: + - /state_event.yaml$/: + { type: StateEventPtr, imports: '"events/event.h"' } + - /room_event.yaml$/: + { type: RoomEventPtr, imports: '"events/event.h"' } + - /event.yaml$/: + { type: EventPtr, imports: '"events/event.h"' } + - array: + - string: { type: QStringList, imports: <QtCore/QStringList> } + - +set: { "noCopy?": true} + +on: + - /^Notification|Result$/: + type: "std::vector<{{1}}>" + imports: '"events/event.h"' + - /m\.room\.member$/: + type: "EventsArray<RoomMemberEvent>" + imports: '"events/roommemberevent.h"' + - /state_event.yaml$/: + type: StateEvents + - /room_event.yaml$/: + type: RoomEvents + - /event.yaml$/: + type: Events + - /.+/: { type: "QVector<{{1}}>", imports: <QtCore/QVector> } + - //: { type: QJsonArray, imports: <QtCore/QJsonArray> } + # `additionalProperties` in OpenAPI + - map: + - RoomState: + type: "std::unordered_map<QString, {{1}}>" + noCopy?: true + imports: <unordered_map> + - /.+/: + type: "QHash<QString, {{1}}>" + imports: <QtCore/QHash> + - //: + type: QVariantHash + imports: '"variant_converters.h"' + # A sequence `type` in OpenAPI + - variant: { type: QVariant, imports: '"variant_converters.h"' } + - schema: # Properties of inline structure definitions + *UseOmittable #operations: @@ -121,12 +109,15 @@ mustache: definitions: _scopeRenderer: "{{scopeCamelCase}}Job::" _literalQuote: '"' - # Default value for omitted - omitted: '{}' - maybeCrefType: "{{#avoidCopy?}}const {{/avoidCopy?}}{{dataType.name}}{{#avoidCopy?}}&{{/avoidCopy?}}{{#noCopy?}}&&{{/noCopy?}}" + omittedValue: '{}' # default value to initialize omitted parameters with + openOmittable: "{{^required?}}{{#useOmittable}}Omittable<{{/useOmittable}}{{/required?}}" + closeOmittable: "{{^required?}}{{#useOmittable}}>{{/useOmittable}}{{/required?}}" + maybeOmittableType: "{{>openOmittable}}{{dataType.name}}{{>closeOmittable}}" + qualifiedMaybeOmittableType: "{{>openOmittable}}{{dataType.qualifiedName}}{{>closeOmittable}}" + maybeCrefType: "{{#avoidCopy?}}const {{/avoidCopy?}}{{>maybeOmittableType}}{{#avoidCopy?}}&{{/avoidCopy?}}{{#noCopy?}}&&{{/noCopy?}}" qualifiedMaybeCrefType: - "{{#avoidCopy?}}const {{/avoidCopy?}}{{dataType.qualifiedName}}{{#avoidCopy?}}&{{/avoidCopy?}}{{#noCopy?}}&&{{/noCopy?}}" - initializeDefaultValue: "{{#defaultValue}}{{#initializer}}{{>initializer}}{{/initializer}}{{/defaultValue}}{{^defaultValue}}{{>omitted}}{{/defaultValue}}" + "{{#avoidCopy?}}const {{/avoidCopy?}}{{>qualifiedMaybeOmittableType}}{{#avoidCopy?}}&{{/avoidCopy?}}{{#noCopy?}}&&{{/noCopy?}}" + initializeDefaultValue: "{{#defaultValue}}{{#initializer}}{{>initializer}}{{/initializer}}{{/defaultValue}}{{^defaultValue}}{{>omittedValue}}{{/defaultValue}}" joinedParamDecl: '{{>maybeCrefType}} {{paramName}}{{^required?}} = {{>initializeDefaultValue}}{{/required?}}{{#@join}}, {{/@join}}' joinedParamDef: '{{>maybeCrefType}} {{paramName}}{{#@join}}, {{/@join}}' passQueryParams: '{{#queryParams}}{{paramName}}{{#@join}}, {{/@join}}{{/queryParams}}' diff --git a/lib/csapi/joining.cpp b/lib/csapi/joining.cpp index 6f8081d0..90aa58c4 100644 --- a/lib/csapi/joining.cpp +++ b/lib/csapi/joining.cpp @@ -19,9 +19,6 @@ namespace QMatrixClient QJsonObject toJson(const JoinRoomByIdJob::ThirdPartySigned& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<>(_json, "sender", pod.sender); addToJson<>(_json, "mxid", pod.mxid); addToJson<>(_json, "token", pod.token); @@ -36,7 +33,7 @@ class JoinRoomByIdJob::Private QString roomId; }; -JoinRoomByIdJob::JoinRoomByIdJob(const QString& roomId, const ThirdPartySigned& thirdPartySigned) +JoinRoomByIdJob::JoinRoomByIdJob(const QString& roomId, const Omittable<ThirdPartySigned>& thirdPartySigned) : BaseJob(HttpVerb::Post, "JoinRoomByIdJob", basePath % "/rooms/" % roomId % "/join") , d(new Private) @@ -70,9 +67,6 @@ namespace QMatrixClient QJsonObject toJson(const JoinRoomJob::Signed& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<>(_json, "sender", pod.sender); addToJson<>(_json, "mxid", pod.mxid); addToJson<>(_json, "token", pod.token); @@ -83,9 +77,6 @@ namespace QMatrixClient QJsonObject toJson(const JoinRoomJob::ThirdPartySigned& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<>(_json, "signed", pod.signedData); return _json; } @@ -97,7 +88,7 @@ class JoinRoomJob::Private QString roomId; }; -JoinRoomJob::JoinRoomJob(const QString& roomIdOrAlias, const ThirdPartySigned& thirdPartySigned) +JoinRoomJob::JoinRoomJob(const QString& roomIdOrAlias, const Omittable<ThirdPartySigned>& thirdPartySigned) : BaseJob(HttpVerb::Post, "JoinRoomJob", basePath % "/join/" % roomIdOrAlias) , d(new Private) diff --git a/lib/csapi/joining.h b/lib/csapi/joining.h index d7c7cbb1..7742a0a5 100644 --- a/lib/csapi/joining.h +++ b/lib/csapi/joining.h @@ -24,13 +24,11 @@ namespace QMatrixClient QString mxid; QString token; QJsonObject signatures; - - bool omitted; }; // Construction/destruction - explicit JoinRoomByIdJob(const QString& roomId, const ThirdPartySigned& thirdPartySigned = omitted<ThirdPartySigned>()); + explicit JoinRoomByIdJob(const QString& roomId, const Omittable<ThirdPartySigned>& thirdPartySigned = none); ~JoinRoomByIdJob() override; // Result properties @@ -56,20 +54,16 @@ namespace QMatrixClient QString mxid; QString token; QJsonObject signatures; - - bool omitted; }; struct ThirdPartySigned { Signed signedData; - - bool omitted; }; // Construction/destruction - explicit JoinRoomJob(const QString& roomIdOrAlias, const ThirdPartySigned& thirdPartySigned = omitted<ThirdPartySigned>()); + explicit JoinRoomJob(const QString& roomIdOrAlias, const Omittable<ThirdPartySigned>& thirdPartySigned = none); ~JoinRoomJob() override; // Result properties diff --git a/lib/csapi/list_public_rooms.cpp b/lib/csapi/list_public_rooms.cpp index b60d14fd..97beba1c 100644 --- a/lib/csapi/list_public_rooms.cpp +++ b/lib/csapi/list_public_rooms.cpp @@ -94,10 +94,10 @@ class GetPublicRoomsJob::Private QVector<PublicRoomsChunk> chunk; QString nextBatch; QString prevBatch; - qint64 totalRoomCountEstimate; + Omittable<qint64> totalRoomCountEstimate; }; -BaseJob::Query queryToGetPublicRooms(int limit, const QString& since, const QString& server) +BaseJob::Query queryToGetPublicRooms(Omittable<int> limit, const QString& since, const QString& server) { BaseJob::Query _q; _q.addQueryItem("limit", QString("%1").arg(limit)); @@ -108,14 +108,14 @@ BaseJob::Query queryToGetPublicRooms(int limit, const QString& since, const QStr return _q; } -QUrl GetPublicRoomsJob::makeRequestUrl(QUrl baseUrl, int limit, const QString& since, const QString& server) +QUrl GetPublicRoomsJob::makeRequestUrl(QUrl baseUrl, Omittable<int> limit, const QString& since, const QString& server) { return BaseJob::makeRequestUrl(std::move(baseUrl), basePath % "/publicRooms", queryToGetPublicRooms(limit, since, server)); } -GetPublicRoomsJob::GetPublicRoomsJob(int limit, const QString& since, const QString& server) +GetPublicRoomsJob::GetPublicRoomsJob(Omittable<int> limit, const QString& since, const QString& server) : BaseJob(HttpVerb::Get, "GetPublicRoomsJob", basePath % "/publicRooms", queryToGetPublicRooms(limit, since, server), @@ -141,7 +141,7 @@ const QString& GetPublicRoomsJob::prevBatch() const return d->prevBatch; } -qint64 GetPublicRoomsJob::totalRoomCountEstimate() const +Omittable<qint64> GetPublicRoomsJob::totalRoomCountEstimate() const { return d->totalRoomCountEstimate; } @@ -166,9 +166,6 @@ namespace QMatrixClient QJsonObject toJson(const QueryPublicRoomsJob::Filter& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<IfNotEmpty>(_json, "generic_search_term", pod.genericSearchTerm); return _json; } @@ -209,7 +206,7 @@ class QueryPublicRoomsJob::Private QVector<PublicRoomsChunk> chunk; QString nextBatch; QString prevBatch; - qint64 totalRoomCountEstimate; + Omittable<qint64> totalRoomCountEstimate; }; BaseJob::Query queryToQueryPublicRooms(const QString& server) @@ -220,7 +217,7 @@ BaseJob::Query queryToQueryPublicRooms(const QString& server) return _q; } -QueryPublicRoomsJob::QueryPublicRoomsJob(const QString& server, int limit, const QString& since, const Filter& filter) +QueryPublicRoomsJob::QueryPublicRoomsJob(const QString& server, Omittable<int> limit, const QString& since, const Omittable<Filter>& filter) : BaseJob(HttpVerb::Post, "QueryPublicRoomsJob", basePath % "/publicRooms", queryToQueryPublicRooms(server)) @@ -250,7 +247,7 @@ const QString& QueryPublicRoomsJob::prevBatch() const return d->prevBatch; } -qint64 QueryPublicRoomsJob::totalRoomCountEstimate() const +Omittable<qint64> QueryPublicRoomsJob::totalRoomCountEstimate() const { return d->totalRoomCountEstimate; } diff --git a/lib/csapi/list_public_rooms.h b/lib/csapi/list_public_rooms.h index ae589378..16278bd5 100644 --- a/lib/csapi/list_public_rooms.h +++ b/lib/csapi/list_public_rooms.h @@ -6,9 +6,9 @@ #include "jobs/basejob.h" -#include "converters.h" #include <QtCore/QVector> #include <QtCore/QStringList> +#include "converters.h" namespace QMatrixClient { @@ -66,14 +66,14 @@ namespace QMatrixClient // Construction/destruction - explicit GetPublicRoomsJob(int limit = {}, const QString& since = {}, const QString& server = {}); + explicit GetPublicRoomsJob(Omittable<int> limit = none, const QString& since = {}, const QString& server = {}); /** Construct a URL out of baseUrl and usual parameters passed to * GetPublicRoomsJob. This function can be used when * a URL for GetPublicRoomsJob is necessary but the job * itself isn't. */ - static QUrl makeRequestUrl(QUrl baseUrl, int limit = {}, const QString& since = {}, const QString& server = {}); + static QUrl makeRequestUrl(QUrl baseUrl, Omittable<int> limit = none, const QString& since = {}, const QString& server = {}); ~GetPublicRoomsJob() override; @@ -82,7 +82,7 @@ namespace QMatrixClient const QVector<PublicRoomsChunk>& chunk() const; const QString& nextBatch() const; const QString& prevBatch() const; - qint64 totalRoomCountEstimate() const; + Omittable<qint64> totalRoomCountEstimate() const; protected: Status parseJson(const QJsonDocument& data) override; @@ -100,8 +100,6 @@ namespace QMatrixClient struct Filter { QString genericSearchTerm; - - bool omitted; }; struct PublicRoomsChunk @@ -119,7 +117,7 @@ namespace QMatrixClient // Construction/destruction - explicit QueryPublicRoomsJob(const QString& server = {}, int limit = {}, const QString& since = {}, const Filter& filter = omitted<Filter>()); + explicit QueryPublicRoomsJob(const QString& server = {}, Omittable<int> limit = none, const QString& since = {}, const Omittable<Filter>& filter = none); ~QueryPublicRoomsJob() override; // Result properties @@ -127,7 +125,7 @@ namespace QMatrixClient const QVector<PublicRoomsChunk>& chunk() const; const QString& nextBatch() const; const QString& prevBatch() const; - qint64 totalRoomCountEstimate() const; + Omittable<qint64> totalRoomCountEstimate() const; protected: Status parseJson(const QJsonDocument& data) override; diff --git a/lib/csapi/message_pagination.cpp b/lib/csapi/message_pagination.cpp index f89ccd03..1ea852de 100644 --- a/lib/csapi/message_pagination.cpp +++ b/lib/csapi/message_pagination.cpp @@ -20,7 +20,7 @@ class GetRoomEventsJob::Private RoomEvents chunk; }; -BaseJob::Query queryToGetRoomEvents(const QString& from, const QString& to, const QString& dir, int limit, const QString& filter) +BaseJob::Query queryToGetRoomEvents(const QString& from, const QString& to, const QString& dir, Omittable<int> limit, const QString& filter) { BaseJob::Query _q; _q.addQueryItem("from", from); @@ -33,14 +33,14 @@ BaseJob::Query queryToGetRoomEvents(const QString& from, const QString& to, cons return _q; } -QUrl GetRoomEventsJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& from, const QString& dir, const QString& to, int limit, const QString& filter) +QUrl GetRoomEventsJob::makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& from, const QString& dir, const QString& to, Omittable<int> limit, const QString& filter) { return BaseJob::makeRequestUrl(std::move(baseUrl), basePath % "/rooms/" % roomId % "/messages", queryToGetRoomEvents(from, to, dir, limit, filter)); } -GetRoomEventsJob::GetRoomEventsJob(const QString& roomId, const QString& from, const QString& dir, const QString& to, int limit, const QString& filter) +GetRoomEventsJob::GetRoomEventsJob(const QString& roomId, const QString& from, const QString& dir, const QString& to, Omittable<int> limit, const QString& filter) : BaseJob(HttpVerb::Get, "GetRoomEventsJob", basePath % "/rooms/" % roomId % "/messages", queryToGetRoomEvents(from, to, dir, limit, filter)) diff --git a/lib/csapi/message_pagination.h b/lib/csapi/message_pagination.h index c9ede1f1..92b258ea 100644 --- a/lib/csapi/message_pagination.h +++ b/lib/csapi/message_pagination.h @@ -7,6 +7,7 @@ #include "jobs/basejob.h" #include "events/event.h" +#include "converters.h" namespace QMatrixClient { @@ -15,14 +16,14 @@ namespace QMatrixClient class GetRoomEventsJob : public BaseJob { public: - explicit GetRoomEventsJob(const QString& roomId, const QString& from, const QString& dir, const QString& to = {}, int limit = {}, const QString& filter = {}); + explicit GetRoomEventsJob(const QString& roomId, const QString& from, const QString& dir, const QString& to = {}, Omittable<int> limit = none, const QString& filter = {}); /** Construct a URL out of baseUrl and usual parameters passed to * GetRoomEventsJob. This function can be used when * a URL for GetRoomEventsJob is necessary but the job * itself isn't. */ - static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& from, const QString& dir, const QString& to = {}, int limit = {}, const QString& filter = {}); + static QUrl makeRequestUrl(QUrl baseUrl, const QString& roomId, const QString& from, const QString& dir, const QString& to = {}, Omittable<int> limit = none, const QString& filter = {}); ~GetRoomEventsJob() override; diff --git a/lib/csapi/notifications.cpp b/lib/csapi/notifications.cpp index 17628cc5..4c77d760 100644 --- a/lib/csapi/notifications.cpp +++ b/lib/csapi/notifications.cpp @@ -47,7 +47,7 @@ class GetNotificationsJob::Private std::vector<Notification> notifications; }; -BaseJob::Query queryToGetNotifications(const QString& from, int limit, const QString& only) +BaseJob::Query queryToGetNotifications(const QString& from, Omittable<int> limit, const QString& only) { BaseJob::Query _q; if (!from.isEmpty()) @@ -58,14 +58,14 @@ BaseJob::Query queryToGetNotifications(const QString& from, int limit, const QSt return _q; } -QUrl GetNotificationsJob::makeRequestUrl(QUrl baseUrl, const QString& from, int limit, const QString& only) +QUrl GetNotificationsJob::makeRequestUrl(QUrl baseUrl, const QString& from, Omittable<int> limit, const QString& only) { return BaseJob::makeRequestUrl(std::move(baseUrl), basePath % "/notifications", queryToGetNotifications(from, limit, only)); } -GetNotificationsJob::GetNotificationsJob(const QString& from, int limit, const QString& only) +GetNotificationsJob::GetNotificationsJob(const QString& from, Omittable<int> limit, const QString& only) : BaseJob(HttpVerb::Get, "GetNotificationsJob", basePath % "/notifications", queryToGetNotifications(from, limit, only)) diff --git a/lib/csapi/notifications.h b/lib/csapi/notifications.h index 2180c658..3a603364 100644 --- a/lib/csapi/notifications.h +++ b/lib/csapi/notifications.h @@ -6,10 +6,10 @@ #include "jobs/basejob.h" +#include "converters.h" +#include <QtCore/QVector> #include <QtCore/QJsonObject> #include "events/event.h" -#include <QtCore/QVector> -#include "converters.h" namespace QMatrixClient { @@ -32,14 +32,14 @@ namespace QMatrixClient // Construction/destruction - explicit GetNotificationsJob(const QString& from = {}, int limit = {}, const QString& only = {}); + explicit GetNotificationsJob(const QString& from = {}, Omittable<int> limit = none, const QString& only = {}); /** Construct a URL out of baseUrl and usual parameters passed to * GetNotificationsJob. This function can be used when * a URL for GetNotificationsJob is necessary but the job * itself isn't. */ - static QUrl makeRequestUrl(QUrl baseUrl, const QString& from = {}, int limit = {}, const QString& only = {}); + static QUrl makeRequestUrl(QUrl baseUrl, const QString& from = {}, Omittable<int> limit = none, const QString& only = {}); ~GetNotificationsJob() override; diff --git a/lib/csapi/pusher.cpp b/lib/csapi/pusher.cpp index 90ac032b..ba5229d3 100644 --- a/lib/csapi/pusher.cpp +++ b/lib/csapi/pusher.cpp @@ -97,9 +97,6 @@ namespace QMatrixClient QJsonObject toJson(const PostPusherJob::PusherData& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<IfNotEmpty>(_json, "url", pod.url); return _json; } diff --git a/lib/csapi/pusher.h b/lib/csapi/pusher.h index 501e93a1..bfea57d1 100644 --- a/lib/csapi/pusher.h +++ b/lib/csapi/pusher.h @@ -32,7 +32,7 @@ namespace QMatrixClient QString deviceDisplayName; QString profileTag; QString lang; - PusherData data; + Omittable<PusherData> data; }; // Construction/destruction @@ -68,8 +68,6 @@ namespace QMatrixClient struct PusherData { QString url; - - bool omitted; }; // Construction/destruction diff --git a/lib/csapi/search.cpp b/lib/csapi/search.cpp index 1cda979f..d43f704b 100644 --- a/lib/csapi/search.cpp +++ b/lib/csapi/search.cpp @@ -19,9 +19,6 @@ namespace QMatrixClient QJsonObject toJson(const SearchJob::IncludeEventContext& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<IfNotEmpty>(_json, "before_limit", pod.beforeLimit); addToJson<IfNotEmpty>(_json, "after_limit", pod.afterLimit); addToJson<IfNotEmpty>(_json, "include_profile", pod.includeProfile); @@ -31,9 +28,6 @@ namespace QMatrixClient QJsonObject toJson(const SearchJob::Group& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<IfNotEmpty>(_json, "key", pod.key); return _json; } @@ -41,9 +35,6 @@ namespace QMatrixClient QJsonObject toJson(const SearchJob::Groupings& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<IfNotEmpty>(_json, "group_by", pod.groupBy); return _json; } @@ -51,9 +42,6 @@ namespace QMatrixClient QJsonObject toJson(const SearchJob::RoomEventsCriteria& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<>(_json, "search_term", pod.searchTerm); addToJson<IfNotEmpty>(_json, "keys", pod.keys); addToJson<IfNotEmpty>(_json, "filter", pod.filter); @@ -67,9 +55,6 @@ namespace QMatrixClient QJsonObject toJson(const SearchJob::Categories& pod) { QJsonObject _json; - if (pod.omitted) - return _json; - addToJson<IfNotEmpty>(_json, "room_events", pod.roomEvents); return _json; } diff --git a/lib/csapi/search.h b/lib/csapi/search.h index f0fb4546..98a6315f 100644 --- a/lib/csapi/search.h +++ b/lib/csapi/search.h @@ -25,25 +25,19 @@ namespace QMatrixClient struct IncludeEventContext { - int beforeLimit; - int afterLimit; + Omittable<int> beforeLimit; + Omittable<int> afterLimit; bool includeProfile; - - bool omitted; }; struct Group { QString key; - - bool omitted; }; struct Groupings { QVector<Group> groupBy; - - bool omitted; }; struct RoomEventsCriteria @@ -52,18 +46,14 @@ namespace QMatrixClient QStringList keys; QJsonObject filter; QString orderBy; - IncludeEventContext eventContext; + Omittable<IncludeEventContext> eventContext; bool includeState; - Groupings groupings; - - bool omitted; + Omittable<Groupings> groupings; }; struct Categories { - RoomEventsCriteria roomEvents; - - bool omitted; + Omittable<RoomEventsCriteria> roomEvents; }; struct UserProfile @@ -83,21 +73,21 @@ namespace QMatrixClient struct Result { - double rank; + Omittable<double> rank; RoomEventPtr result; - EventContext context; + Omittable<EventContext> context; }; struct GroupValue { QString nextBatch; - int order; + Omittable<int> order; QStringList results; }; struct ResultRoomEvents { - qint64 count; + Omittable<qint64> count; std::vector<Result> results; std::unordered_map<QString, StateEvents> state; QHash<QString, QHash<QString, GroupValue>> groups; @@ -106,7 +96,7 @@ namespace QMatrixClient struct ResultCategories { - ResultRoomEvents roomEvents; + Omittable<ResultRoomEvents> roomEvents; }; // Construction/destruction diff --git a/lib/csapi/typing.cpp b/lib/csapi/typing.cpp index 898bc149..605e143a 100644 --- a/lib/csapi/typing.cpp +++ b/lib/csapi/typing.cpp @@ -12,7 +12,7 @@ using namespace QMatrixClient; static const auto basePath = QStringLiteral("/_matrix/client/r0"); -SetTypingJob::SetTypingJob(const QString& userId, const QString& roomId, bool typing, int timeout) +SetTypingJob::SetTypingJob(const QString& userId, const QString& roomId, bool typing, Omittable<int> timeout) : BaseJob(HttpVerb::Put, "SetTypingJob", basePath % "/rooms/" % roomId % "/typing/" % userId) { diff --git a/lib/csapi/typing.h b/lib/csapi/typing.h index 7cf27ef6..f4fa36e8 100644 --- a/lib/csapi/typing.h +++ b/lib/csapi/typing.h @@ -6,6 +6,7 @@ #include "jobs/basejob.h" +#include "converters.h" namespace QMatrixClient { @@ -14,6 +15,6 @@ namespace QMatrixClient class SetTypingJob : public BaseJob { public: - explicit SetTypingJob(const QString& userId, const QString& roomId, bool typing, int timeout = {}); + explicit SetTypingJob(const QString& userId, const QString& roomId, bool typing, Omittable<int> timeout = none); }; } // namespace QMatrixClient diff --git a/lib/csapi/users.cpp b/lib/csapi/users.cpp index 36cdf3cc..a27be93b 100644 --- a/lib/csapi/users.cpp +++ b/lib/csapi/users.cpp @@ -41,7 +41,7 @@ class SearchUserDirectoryJob::Private bool limited; }; -SearchUserDirectoryJob::SearchUserDirectoryJob(const QString& searchTerm, int limit) +SearchUserDirectoryJob::SearchUserDirectoryJob(const QString& searchTerm, Omittable<int> limit) : BaseJob(HttpVerb::Post, "SearchUserDirectoryJob", basePath % "/user_directory/search") , d(new Private) diff --git a/lib/csapi/users.h b/lib/csapi/users.h index 203ddc37..ecf1faaf 100644 --- a/lib/csapi/users.h +++ b/lib/csapi/users.h @@ -6,8 +6,8 @@ #include "jobs/basejob.h" -#include "converters.h" #include <QtCore/QVector> +#include "converters.h" namespace QMatrixClient { @@ -27,7 +27,7 @@ namespace QMatrixClient // Construction/destruction - explicit SearchUserDirectoryJob(const QString& searchTerm, int limit = {}); + explicit SearchUserDirectoryJob(const QString& searchTerm, Omittable<int> limit = none); ~SearchUserDirectoryJob() override; // Result properties diff --git a/lib/csapi/{{base}}.cpp.mustache b/lib/csapi/{{base}}.cpp.mustache index c6504f42..4abe38eb 100644 --- a/lib/csapi/{{base}}.cpp.mustache +++ b/lib/csapi/{{base}}.cpp.mustache @@ -10,10 +10,7 @@ using namespace QMatrixClient; {{#models.model}}{{#in?}} QJsonObject QMatrixClient::toJson(const {{qualifiedName}}& pod) { - QJsonObject _json; - if (pod.omitted) - return _json; -{{#vars}} + QJsonObject _json;{{#vars}} addToJson<{{^required?}}IfNotEmpty{{/required?}}>(_json, "{{baseName}}", pod.{{nameCamelCase}});{{/vars}} return _json; } @@ -36,10 +33,7 @@ namespace QMatrixClient {{#model}}{{#in?}} QJsonObject toJson(const {{qualifiedName}}& pod) { - QJsonObject _json; - if (pod.omitted) - return _json; -{{#vars}} + QJsonObject _json;{{#vars}} addToJson<{{^required?}}IfNotEmpty{{/required?}}>(_json, "{{baseName}}", pod.{{nameCamelCase}});{{/vars}} return _json; } @@ -61,7 +55,7 @@ namespace QMatrixClient class {{camelCaseOperationId}}Job::Private { public:{{#allProperties}} - {{dataType.name}} {{paramName}};{{/allProperties}} + {{>maybeOmittableType}} {{paramName}};{{/allProperties}} }; {{/ allProperties?}}{{/normalResponse?}}{{/responses}}{{#queryParams?}} BaseJob::Query queryTo{{camelCaseOperationId}}({{#queryParams}}{{>joinedParamDef}}{{/queryParams}}) diff --git a/lib/csapi/{{base}}.h.mustache b/lib/csapi/{{base}}.h.mustache index 6f08e871..1d24163f 100644 --- a/lib/csapi/{{base}}.h.mustache +++ b/lib/csapi/{{base}}.h.mustache @@ -13,10 +13,8 @@ namespace QMatrixClient {{# model}} struct {{name}}{{#parents?}} : {{#parents}}{{name}}{{#@join}}, {{/@join}}{{/parents}}{{/parents?}} { -{{#vars}} {{dataType.name}} {{nameCamelCase}}; -{{/vars}}{{#in?}} - bool omitted; -{{/in?}} }; +{{#vars}} {{>maybeOmittableType}} {{nameCamelCase}}; +{{/vars}} }; {{#in?}} QJsonObject toJson(const {{name}}& pod); {{/in?}}{{#out?}} @@ -34,10 +32,8 @@ namespace QMatrixClient {{# model}} struct {{name}}{{#parents?}} : {{#parents}}{{name}}{{#@join}}, {{/@join}}{{/parents}}{{/parents?}} { -{{#vars}} {{dataType.name}} {{nameCamelCase}}; -{{/vars}}{{#in?}} - bool omitted; -{{/in?}} }; +{{#vars}} {{>maybeOmittableType}} {{nameCamelCase}}; +{{/vars}} }; {{/ model}} // Construction/destruction {{/ models}} |