From 3cbf610cd054d4a1ae2906967608d48deea62c66 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sat, 24 Oct 2020 21:24:38 -0700 Subject: [PATCH] ircd::m::user::pushers: Additional derivative utils for interface. --- include/ircd/m/user/pushers.h | 6 +++++ matrix/user_pushers.cc | 43 +++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/ircd/m/user/pushers.h b/include/ircd/m/user/pushers.h index 7888f5042..0873fb70f 100644 --- a/include/ircd/m/user/pushers.h +++ b/include/ircd/m/user/pushers.h @@ -19,7 +19,13 @@ struct ircd::m::user::pushers m::user user; public: + bool for_each(const closure_bool &) const; + + size_t count(const string_view &kind = {}) const; + bool any(const string_view &kind = {}) const; + bool has(const string_view &key) const; + bool get(std::nothrow_t, const string_view &key, const closure &) const; void get(const string_view &key, const closure &) const; bool set(const json::object &value) const; diff --git a/matrix/user_pushers.cc b/matrix/user_pushers.cc index 26017fd26..267b6fb32 100644 --- a/matrix/user_pushers.cc +++ b/matrix/user_pushers.cc @@ -120,6 +120,49 @@ const }); } +bool +ircd::m::user::pushers::has(const string_view &key) +const +{ + return !for_each([&key] // for_each() returns true if no match + (const event::idx &pusher_idx, const string_view &pushkey, const push::pusher &pusher) + { + return key != pushkey; + }); +} + +bool +ircd::m::user::pushers::any(const string_view &kind) +const +{ + return !for_each([&kind] // for_each() returns true if no match + (const event::idx &pusher_idx, const string_view &pushkey, const push::pusher &pusher) + { + if(!kind) + return false; + + if(json::get<"kind"_>(pusher) == kind) + return false; + + return true; + }); +} + +size_t +ircd::m::user::pushers::count(const string_view &kind) +const +{ + size_t ret{0}; + for_each([&ret, &kind] + (const event::idx &pusher_idx, const string_view &pushkey, const push::pusher &pusher) + { + ret += !kind || json::get<"kind"_>(pusher) == kind; + return true; + }); + + return ret; +} + bool ircd::m::user::pushers::for_each(const closure_bool &closure) const