diff --git a/CMakeLists.txt b/CMakeLists.txt index cee63a3..24aef43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required (VERSION 3.7) project (mastodon-cpp - VERSION 0.18.1 + VERSION 0.18.2 LANGUAGES CXX ) diff --git a/src/easy/easy.hpp b/src/easy/easy.hpp index 8c23bd9..cc47934 100644 --- a/src/easy/easy.hpp +++ b/src/easy/easy.hpp @@ -341,9 +341,9 @@ public: /*! * @brief Returns true if the Entity holds valid data * - * @since before 0.11.0 + * @since before 0.11.0 (virtual since 0.18.2) */ - const bool valid() const; + virtual const bool valid() const = 0; /*! * @brief Returns error string sent by the server @@ -444,9 +444,20 @@ public: const std::uint_fast64_t stouint64(const string &str) const; + /*! + * @brief Checks if an Entity is valid + * + * @param attributes The attributes to check + * + * @return true if all attributes are set + * + * @since 0.18.2 + */ + const bool + check_valid(const std::vector &attributes) const; + private: Json::Value _tree; - bool _valid; mutable bool _was_set; }; diff --git a/src/easy/entities/account.cpp b/src/easy/entities/account.cpp index 447b74a..38a98c9 100644 --- a/src/easy/entities/account.cpp +++ b/src/easy/entities/account.cpp @@ -14,6 +14,7 @@ * along with this program. If not, see . */ +#include #include "account.hpp" #include "macros.hpp" @@ -28,6 +29,30 @@ Account::Account() : Entity() {} +const bool Account::valid() const +{ + const std::vector attributes = + {{ + "id", + "username", + "acct", + "display_name", + "locked", + "created_at", + "followers_count", + "following_count", + "statuses_count", + "note", + "url", + "avatar", + "avatar_static", + "header", + "header_static" + }}; + + return Entity::check_valid(attributes); +} + const string Account::acct() const { return get_string("acct"); diff --git a/src/easy/entities/account.hpp b/src/easy/entities/account.hpp index ea7fd1b..978cd4e 100644 --- a/src/easy/entities/account.hpp +++ b/src/easy/entities/account.hpp @@ -69,6 +69,8 @@ namespace Mastodon */ Account(); + virtual const bool valid() const; + /*! * @brief Returns username * diff --git a/src/easy/entities/application.cpp b/src/easy/entities/application.cpp index bec917f..57fd74b 100644 --- a/src/easy/entities/application.cpp +++ b/src/easy/entities/application.cpp @@ -27,6 +27,11 @@ Application::Application() : Entity() {} +const bool Application::valid() const +{ + return Entity::check_valid({"name"}); +} + const string Application::name() const { return get_string("name"); diff --git a/src/easy/entities/application.hpp b/src/easy/entities/application.hpp index feba73f..e88e4b2 100644 --- a/src/easy/entities/application.hpp +++ b/src/easy/entities/application.hpp @@ -56,6 +56,8 @@ namespace Mastodon */ Application(); + virtual const bool valid() const; + /*! * @brief Returns the name of the application * diff --git a/src/easy/entities/attachment.cpp b/src/easy/entities/attachment.cpp index c155099..40203e6 100644 --- a/src/easy/entities/attachment.cpp +++ b/src/easy/entities/attachment.cpp @@ -29,6 +29,19 @@ Attachment::Attachment() : Entity() {} +const bool Attachment::valid() const +{ + const std::vector attributes = + {{ + "id", + "type", + "url", + "preview_url" + }}; + + return Entity::check_valid(attributes); +} + const double Attachment::aspect() const { return get_double("meta.original.aspect"); diff --git a/src/easy/entities/attachment.hpp b/src/easy/entities/attachment.hpp index 805c4f7..ab38050 100644 --- a/src/easy/entities/attachment.hpp +++ b/src/easy/entities/attachment.hpp @@ -60,6 +60,8 @@ namespace Mastodon */ Attachment(); + virtual const bool valid() const; + /*! * @brief Aspect of original image * diff --git a/src/easy/entities/card.cpp b/src/easy/entities/card.cpp index c8dec9d..129651c 100644 --- a/src/easy/entities/card.cpp +++ b/src/easy/entities/card.cpp @@ -28,6 +28,19 @@ Card::Card() : Entity() {} +const bool Card::valid() const +{ + const std::vector attributes = + {{ + "url", + "title", + "description", + "type" + }}; + + return Entity::check_valid(attributes); +} + const string Card::author_name() const { return get_string("author_name"); diff --git a/src/easy/entities/card.hpp b/src/easy/entities/card.hpp index 7c6437a..12a4e45 100644 --- a/src/easy/entities/card.hpp +++ b/src/easy/entities/card.hpp @@ -58,6 +58,8 @@ namespace Mastodon */ Card(); + virtual const bool valid() const; + /*! * @brief Returns the name of the author * diff --git a/src/easy/entities/context.cpp b/src/easy/entities/context.cpp index 9f521a7..9dc84e1 100644 --- a/src/easy/entities/context.cpp +++ b/src/easy/entities/context.cpp @@ -28,6 +28,17 @@ Context::Context() : Entity() {} +const bool Context::valid() const +{ + const std::vector attributes = + {{ + "ancestors", + "descendants" + }}; + + return Entity::check_valid(attributes); +} + const std::vector Context::ancestors() const { const Json::Value node = get("ancestors"); diff --git a/src/easy/entities/context.hpp b/src/easy/entities/context.hpp index a8e1ed9..84d6117 100644 --- a/src/easy/entities/context.hpp +++ b/src/easy/entities/context.hpp @@ -59,6 +59,8 @@ namespace Mastodon */ Context(); + virtual const bool valid() const; + /*! * @brief Returns the ancestors of the Status as vector of Statuses * diff --git a/src/easy/entities/emoji.cpp b/src/easy/entities/emoji.cpp index 3782b02..49ff660 100644 --- a/src/easy/entities/emoji.cpp +++ b/src/easy/entities/emoji.cpp @@ -28,6 +28,18 @@ Emoji::Emoji() : Entity() {} +const bool Emoji::valid() const +{ + const std::vector attributes = + {{ + "shortcode", + "static_url", + "url" + }}; + + return Entity::check_valid(attributes); +} + const string Emoji::shortcode() const { return get_string("shortcode"); diff --git a/src/easy/entities/emoji.hpp b/src/easy/entities/emoji.hpp index 76779bd..3b5e5af 100644 --- a/src/easy/entities/emoji.hpp +++ b/src/easy/entities/emoji.hpp @@ -56,6 +56,8 @@ namespace Mastodon */ Emoji(); + virtual const bool valid() const; + /*! * @brief Returns the shortcode of the emoji * diff --git a/src/easy/entities/instance.cpp b/src/easy/entities/instance.cpp index ef658f6..e847682 100644 --- a/src/easy/entities/instance.cpp +++ b/src/easy/entities/instance.cpp @@ -30,6 +30,23 @@ Instance::Instance() : Entity() {} +const bool Instance::valid() const +{ + const std::vector attributes = + {{ + "uri", + "title", + "description", + "email", + "version", + "urls", + "languages", + "contact_account" + }}; + + return Entity::check_valid(attributes); +} + const Easy::Account Instance::contact_account() const { const Json::Value node = get("contact_account"); diff --git a/src/easy/entities/instance.hpp b/src/easy/entities/instance.hpp index 1274c45..5c0cb5c 100644 --- a/src/easy/entities/instance.hpp +++ b/src/easy/entities/instance.hpp @@ -59,6 +59,8 @@ namespace Mastodon */ Instance(); + virtual const bool valid() const; + /*! * @brief Returns the Account of the admin or another contact person * diff --git a/src/easy/entities/list.cpp b/src/easy/entities/list.cpp index ba64357..c0d12a9 100644 --- a/src/easy/entities/list.cpp +++ b/src/easy/entities/list.cpp @@ -29,6 +29,17 @@ List::List() : Entity() {} +const bool List::valid() const +{ + const std::vector attributes = + {{ + "id", + "title" + }}; + + return Entity::check_valid(attributes); +} + const uint_fast64_t List::id() const { return stouint64(get_string("id")); diff --git a/src/easy/entities/list.hpp b/src/easy/entities/list.hpp index b5d6a8c..2a8a324 100644 --- a/src/easy/entities/list.hpp +++ b/src/easy/entities/list.hpp @@ -59,6 +59,8 @@ namespace Mastodon */ List(); + virtual const bool valid() const; + /*! * @brief Returns list-ID * diff --git a/src/easy/entities/mention.cpp b/src/easy/entities/mention.cpp index 17dd000..78a369e 100644 --- a/src/easy/entities/mention.cpp +++ b/src/easy/entities/mention.cpp @@ -27,6 +27,19 @@ Mention::Mention() : Entity() {} +const bool Mention::valid() const +{ + const std::vector attributes = + {{ + "url", + "username", + "acct", + "id" + }}; + + return Entity::check_valid(attributes); +} + const string Mention::acct() const { return get_string("acct"); diff --git a/src/easy/entities/mention.hpp b/src/easy/entities/mention.hpp index 70a1834..c0a7376 100644 --- a/src/easy/entities/mention.hpp +++ b/src/easy/entities/mention.hpp @@ -59,6 +59,8 @@ namespace Mastodon */ Mention(); + virtual const bool valid() const; + /*! * @brief Returns acct * diff --git a/src/easy/entities/notification.cpp b/src/easy/entities/notification.cpp index 6d672b0..b6d277e 100644 --- a/src/easy/entities/notification.cpp +++ b/src/easy/entities/notification.cpp @@ -28,6 +28,19 @@ Notification::Notification() : Entity() {} +const bool Notification::valid() const +{ + const std::vector attributes = + {{ + "id", + "type", + "created_at", + "account" + }}; + + return Entity::check_valid(attributes); +} + const Easy::Account Notification::account() const { const Json::Value node = get("account"); diff --git a/src/easy/entities/notification.hpp b/src/easy/entities/notification.hpp index d9efe09..b7b766a 100644 --- a/src/easy/entities/notification.hpp +++ b/src/easy/entities/notification.hpp @@ -64,6 +64,8 @@ namespace Mastodon */ Notification(); + virtual const bool valid() const; + /*! * @brief Returns the Account sending the notification to the user * diff --git a/src/easy/entities/pushsubscription.cpp b/src/easy/entities/pushsubscription.cpp index 11f5199..3882c89 100644 --- a/src/easy/entities/pushsubscription.cpp +++ b/src/easy/entities/pushsubscription.cpp @@ -32,6 +32,18 @@ PushSubscription::PushSubscription() : Entity() {} +const bool PushSubscription::valid() const +{ + const std::vector attributes = + {{ + "id", + "endpoint", + "server_key" + }}; + + return Entity::check_valid(attributes); +} + const string PushSubscription::endpoint() const { return get_string("endpoint"); diff --git a/src/easy/entities/pushsubscription.hpp b/src/easy/entities/pushsubscription.hpp index e7c0e6a..1f7b50d 100644 --- a/src/easy/entities/pushsubscription.hpp +++ b/src/easy/entities/pushsubscription.hpp @@ -59,6 +59,8 @@ namespace Mastodon */ PushSubscription(); + virtual const bool valid() const; + /*! * @brief Returns push subscription ID * diff --git a/src/easy/entities/relationship.cpp b/src/easy/entities/relationship.cpp index c775d73..58c3f31 100644 --- a/src/easy/entities/relationship.cpp +++ b/src/easy/entities/relationship.cpp @@ -27,6 +27,23 @@ Relationship::Relationship() : Entity() {} +const bool Relationship::valid() const +{ + const std::vector attributes = + {{ + "id", + "following", + "followed_by", + "blocking", + "muting", + "muting_notifications", + "requested", + "domain_blocking" + }}; + + return Entity::check_valid(attributes); +} + const bool Relationship::blocking() const { return get_bool("blocking"); diff --git a/src/easy/entities/relationship.hpp b/src/easy/entities/relationship.hpp index d889685..5754bfc 100644 --- a/src/easy/entities/relationship.hpp +++ b/src/easy/entities/relationship.hpp @@ -58,6 +58,8 @@ namespace Mastodon */ Relationship(); + virtual const bool valid() const; + /*! * @brief Returns true if the user is blocking the account * diff --git a/src/easy/entities/report.cpp b/src/easy/entities/report.cpp index bbbd0f6..7a85b5e 100644 --- a/src/easy/entities/report.cpp +++ b/src/easy/entities/report.cpp @@ -27,6 +27,17 @@ Report::Report() : Entity() {} +const bool Report::valid() const +{ + const std::vector attributes = + {{ + "id", + "action_taken" + }}; + + return Entity::check_valid(attributes); +} + const bool Report::action_taken() const { return get_bool("action_taken"); diff --git a/src/easy/entities/report.hpp b/src/easy/entities/report.hpp index 35e0412..ef80a74 100644 --- a/src/easy/entities/report.hpp +++ b/src/easy/entities/report.hpp @@ -58,6 +58,8 @@ namespace Mastodon */ Report(); + virtual const bool valid() const; + /*! * @brief Returns true if an action was taken in response to the * report diff --git a/src/easy/entities/results.cpp b/src/easy/entities/results.cpp index 089315d..e571802 100644 --- a/src/easy/entities/results.cpp +++ b/src/easy/entities/results.cpp @@ -28,6 +28,18 @@ Results::Results() : Entity() {} +const bool Results::valid() const +{ + const std::vector attributes = + {{ + "accounts", + "statuses", + "hashtags" + }}; + + return Entity::check_valid(attributes); +} + const std::vector Results::accounts() const { const Json::Value node = get("accounts"); diff --git a/src/easy/entities/results.hpp b/src/easy/entities/results.hpp index 9aca8c0..685717d 100644 --- a/src/easy/entities/results.hpp +++ b/src/easy/entities/results.hpp @@ -63,6 +63,8 @@ namespace Mastodon */ Results(); + virtual const bool valid() const; + /*! * @brief Returns an array of matched Accounts * diff --git a/src/easy/entities/status.cpp b/src/easy/entities/status.cpp index 6bfcfd7..3b7f383 100644 --- a/src/easy/entities/status.cpp +++ b/src/easy/entities/status.cpp @@ -29,6 +29,29 @@ Status::Status() : Entity() {} +const bool Status::valid() const +{ + const std::vector attributes = + {{ + "id", + "uri", + "account", + "content", + "created_at", + "emojis", + "reblogs_count", + "favourites_count", + "sensitive", + "spoiler_text", + "visibility", + "media_attachments", + "mentions", + "tags" + }}; + + return Entity::check_valid(attributes); +} + const Easy::Account Status::account() const { const Json::Value node = get("account"); diff --git a/src/easy/entities/status.hpp b/src/easy/entities/status.hpp index ab666d7..2da5198 100644 --- a/src/easy/entities/status.hpp +++ b/src/easy/entities/status.hpp @@ -73,6 +73,8 @@ namespace Mastodon */ Status(); + virtual const bool valid() const; + /*! * @brief Returns an array of matched accounts. * diff --git a/src/easy/entities/tag.cpp b/src/easy/entities/tag.cpp index 47dcbfb..1899483 100644 --- a/src/easy/entities/tag.cpp +++ b/src/easy/entities/tag.cpp @@ -30,6 +30,17 @@ Tag::Tag() : Entity() {} +const bool Tag::valid() const +{ + const std::vector attributes = + {{ + "name", + "url" + }}; + + return Entity::check_valid(attributes); +} + const string Tag::name() const { return get_string("name"); @@ -66,6 +77,18 @@ Tag::History::History() : Entity() {} +const bool Tag::History::valid() const +{ + const std::vector attributes = + {{ + "day", + "uses", + "accounts" + }}; + + return Entity::check_valid(attributes); +} + const uint_fast64_t Tag::History::accounts() { return stouint64(get_string("accounts")); diff --git a/src/easy/entities/tag.hpp b/src/easy/entities/tag.hpp index a9b10ef..46b9214 100644 --- a/src/easy/entities/tag.hpp +++ b/src/easy/entities/tag.hpp @@ -68,6 +68,8 @@ namespace Mastodon */ History(); + virtual const bool valid() const; + /*! * @brief Returns the number of accounts using that hashtag. * @@ -106,6 +108,8 @@ namespace Mastodon */ Tag(); + virtual const bool valid() const; + /*! * @brief Returns the name of the tag * diff --git a/src/easy/entity.cpp b/src/easy/entity.cpp index 6d07eaa..79e4cba 100644 --- a/src/easy/entity.cpp +++ b/src/easy/entity.cpp @@ -28,7 +28,6 @@ using std::chrono::system_clock; Easy::Entity::Entity(const string &json) : _tree(Json::nullValue) -, _valid(false) ,_was_set(false) { from_string(json); @@ -56,10 +55,6 @@ const void Easy::Entity::from_string(const string &json) ttdebug << "ERROR: Server returned an error\n"; ttdebug << "String was: " << json << '\n'; } - else - { - _valid = true; - } } const Json::Value Easy::Entity::to_object() const @@ -68,13 +63,22 @@ const Json::Value Easy::Entity::to_object() const } Easy::Entity::Entity() -: _valid(false) -, _was_set(false) +: _was_set(false) {} -const bool Easy::Entity::valid() const +const bool +Easy::Entity::check_valid(const std::vector &attributes) const { - return _valid; + for (const string &attribute: attributes) + { + get(attribute); + if (!was_set()) + { + return false; + } + } + + return true; } const string Easy::Entity::error() const