backends: use IsSubscribedFn in method signatures

Despite having the IsSubscribedFn struct wrapper for closures that check
if a mailbox is subscribed or not, backend methods were still using
  Box<dyn Fn(... types. Switch to using the wrapper newtype everywhere.

Signed-off-by: Manos Pitsidianakis <manos@pitsidianak.is>
pull/495/head
Manos Pitsidianakis 3 weeks ago
parent cd2e4bf3a4
commit 5915f125c3
No known key found for this signature in database
GPG Key ID: 7729C7707F7E09D0

@ -203,7 +203,7 @@ impl Account {
let s = settings.clone(); let s = settings.clone();
let backend = map.get(&settings.account().format)( let backend = map.get(&settings.account().format)(
settings.account(), settings.account(),
Box::new(move |path: &str| { (Box::new(move |path: &str| {
// disjoint-capture-in-closures // disjoint-capture-in-closures
let _ = &s; let _ = &s;
s.account.subscribed_mailboxes.is_empty() s.account.subscribed_mailboxes.is_empty()
@ -213,7 +213,8 @@ impl Account {
.subscribed_mailboxes .subscribed_mailboxes
.iter() .iter()
.any(|m| path.fnmatches(m)) .any(|m| path.fnmatches(m))
}), }) as Box<dyn Fn(&str) -> bool + Send + Sync>)
.into(),
event_consumer, event_consumer,
)?; )?;

@ -79,7 +79,7 @@ pub trait PublicInbox {
extra, extra,
}; };
NntpType::new(&account_conf, Box::new(|_| true), event_consumer) NntpType::new(&account_conf, Default::default(), event_consumer)
} }
} }

@ -259,7 +259,7 @@ pub fn tool(path: Option<PathBuf>, opt: ToolOpt) -> Result<()> {
let imap = melib::imap::ImapType::new( let imap = melib::imap::ImapType::new(
&account_conf.account, &account_conf.account,
Box::new(|_| true), Default::default(),
melib::BackendEventConsumer::new(std::sync::Arc::new(|_, _| ())), melib::BackendEventConsumer::new(std::sync::Arc::new(|_, _| ())),
)?; )?;

@ -62,11 +62,7 @@ pub mod prelude {
use prelude::*; use prelude::*;
pub type BackendCreator = Box< pub type BackendCreator = Box<
dyn Fn( dyn Fn(&AccountSettings, IsSubscribedFn, BackendEventConsumer) -> Result<Box<dyn MailBackend>>,
&AccountSettings,
Box<dyn Fn(&str) -> bool + Send + Sync>,
BackendEventConsumer,
) -> Result<Box<dyn MailBackend>>,
>; >;
pub type BackendValidateConfigFn = Box<dyn Fn(&mut AccountSettings) -> Result<()>>; pub type BackendValidateConfigFn = Box<dyn Fn(&mut AccountSettings) -> Result<()>>;
@ -352,6 +348,24 @@ impl Deref for BackendEventConsumer {
} }
} }
impl From<Arc<dyn Fn(AccountHash, BackendEvent) + Send + Sync>> for BackendEventConsumer {
fn from(val: Arc<dyn Fn(AccountHash, BackendEvent) + Send + Sync>) -> Self {
Self(val)
}
}
impl From<Box<dyn Fn(AccountHash, BackendEvent) + Send + Sync>> for BackendEventConsumer {
fn from(val: Box<dyn Fn(AccountHash, BackendEvent) + Send + Sync>) -> Self {
Self(val.into())
}
}
impl Default for BackendEventConsumer {
fn default() -> Self {
Self(Arc::new(|_, _| {}))
}
}
#[derive(Clone, Debug, Eq, Hash, PartialEq)] #[derive(Clone, Debug, Eq, Hash, PartialEq)]
pub enum FlagOp { pub enum FlagOp {
Set(Flag), Set(Flag),
@ -821,7 +835,26 @@ impl LazyCountSet {
} }
} }
pub struct IsSubscribedFn(pub Box<dyn Fn(&str) -> bool + Send + Sync>); #[derive(Clone)]
pub struct IsSubscribedFn(Arc<dyn Fn(&str) -> bool + Send + Sync>);
impl From<Arc<dyn Fn(&str) -> bool + Send + Sync>> for IsSubscribedFn {
fn from(val: Arc<dyn Fn(&str) -> bool + Send + Sync>) -> Self {
Self(val)
}
}
impl From<Box<dyn Fn(&str) -> bool + Send + Sync>> for IsSubscribedFn {
fn from(val: Box<dyn Fn(&str) -> bool + Send + Sync>) -> Self {
Self(val.into())
}
}
impl Default for IsSubscribedFn {
fn default() -> Self {
Self(Arc::new(|_| true))
}
}
impl std::fmt::Debug for IsSubscribedFn { impl std::fmt::Debug for IsSubscribedFn {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
@ -830,8 +863,9 @@ impl std::fmt::Debug for IsSubscribedFn {
} }
impl std::ops::Deref for IsSubscribedFn { impl std::ops::Deref for IsSubscribedFn {
type Target = Box<dyn Fn(&str) -> bool + Send + Sync>; type Target = dyn Fn(&str) -> bool + Send + Sync;
fn deref(&self) -> &Box<dyn Fn(&str) -> bool + Send + Sync> {
&self.0 fn deref(&self) -> &Self::Target {
self.0.as_ref()
} }
} }

@ -240,7 +240,7 @@ impl UIDStore {
#[derive(Debug)] #[derive(Debug)]
pub struct ImapType { pub struct ImapType {
pub _is_subscribed: Arc<IsSubscribedFn>, pub _is_subscribed: IsSubscribedFn,
pub connection: Arc<FutureMutex<ImapConnection>>, pub connection: Arc<FutureMutex<ImapConnection>>,
pub server_conf: ImapServerConf, pub server_conf: ImapServerConf,
pub uid_store: Arc<UIDStore>, pub uid_store: Arc<UIDStore>,
@ -1359,7 +1359,7 @@ impl MailBackend for ImapType {
impl ImapType { impl ImapType {
pub fn new( pub fn new(
s: &AccountSettings, s: &AccountSettings,
is_subscribed: Box<dyn Fn(&str) -> bool + Send + Sync>, is_subscribed: IsSubscribedFn,
event_consumer: BackendEventConsumer, event_consumer: BackendEventConsumer,
) -> Result<Box<Self>> { ) -> Result<Box<Self>> {
let server_hostname = get_conf_val!(s["server_hostname"])?; let server_hostname = get_conf_val!(s["server_hostname"])?;
@ -1439,7 +1439,7 @@ impl ImapType {
Ok(Box::new(Self { Ok(Box::new(Self {
server_conf, server_conf,
_is_subscribed: Arc::new(IsSubscribedFn(is_subscribed)), _is_subscribed: is_subscribed,
connection: Arc::new(FutureMutex::new(connection)), connection: Arc::new(FutureMutex::new(connection)),
uid_store, uid_store,
})) }))

@ -293,7 +293,7 @@ pub struct Store {
pub mailboxes_index: Arc<RwLock<HashMap<MailboxHash, HashSet<EnvelopeHash>>>>, pub mailboxes_index: Arc<RwLock<HashMap<MailboxHash, HashSet<EnvelopeHash>>>>,
pub mailbox_state: Arc<FutureMutex<State<mailbox::MailboxObject>>>, pub mailbox_state: Arc<FutureMutex<State<mailbox::MailboxObject>>>,
pub online_status: OnlineStatus, pub online_status: OnlineStatus,
pub is_subscribed: Arc<IsSubscribedFn>, pub is_subscribed: IsSubscribedFn,
pub core_capabilities: Arc<Mutex<IndexMap<String, CapabilitiesObject>>>, pub core_capabilities: Arc<Mutex<IndexMap<String, CapabilitiesObject>>>,
pub event_consumer: BackendEventConsumer, pub event_consumer: BackendEventConsumer,
} }
@ -1261,7 +1261,7 @@ impl MailBackend for JmapType {
impl JmapType { impl JmapType {
pub fn new( pub fn new(
s: &AccountSettings, s: &AccountSettings,
is_subscribed: Box<dyn Fn(&str) -> bool + Send + Sync>, is_subscribed: IsSubscribedFn,
event_consumer: BackendEventConsumer, event_consumer: BackendEventConsumer,
) -> Result<Box<Self>> { ) -> Result<Box<Self>> {
let online_status = OnlineStatus(Arc::new(FutureMutex::new(( let online_status = OnlineStatus(Arc::new(FutureMutex::new((
@ -1278,7 +1278,7 @@ impl JmapType {
extra_identities: s.extra_identities.clone(), extra_identities: s.extra_identities.clone(),
online_status, online_status,
event_consumer, event_consumer,
is_subscribed: Arc::new(IsSubscribedFn(is_subscribed)), is_subscribed,
collection: Collection::default(), collection: Collection::default(),
core_capabilities: Arc::new(Mutex::new(IndexMap::default())), core_capabilities: Arc::new(Mutex::new(IndexMap::default())),
byte_cache: Default::default(), byte_cache: Default::default(),

@ -142,6 +142,7 @@ pub struct MaildirType {
pub mailbox_index: Arc<Mutex<HashMap<EnvelopeHash, MailboxHash>>>, pub mailbox_index: Arc<Mutex<HashMap<EnvelopeHash, MailboxHash>>>,
pub hash_indexes: HashIndexes, pub hash_indexes: HashIndexes,
pub event_consumer: BackendEventConsumer, pub event_consumer: BackendEventConsumer,
pub is_subscribed: IsSubscribedFn,
pub collection: Collection, pub collection: Collection,
pub path: PathBuf, pub path: PathBuf,
pub config: Arc<Configuration>, pub config: Arc<Configuration>,
@ -596,7 +597,7 @@ impl MailBackend for MaildirType {
impl MaildirType { impl MaildirType {
pub fn new( pub fn new(
settings: &AccountSettings, settings: &AccountSettings,
is_subscribed: Box<dyn Fn(&str) -> bool>, is_subscribed: IsSubscribedFn,
event_consumer: BackendEventConsumer, event_consumer: BackendEventConsumer,
) -> Result<Box<Self>> { ) -> Result<Box<Self>> {
let config = Arc::new(Configuration::new(settings)?); let config = Arc::new(Configuration::new(settings)?);
@ -745,6 +746,7 @@ impl MaildirType {
Ok(Box::new(Self { Ok(Box::new(Self {
name: settings.name.to_string(), name: settings.name.to_string(),
mailboxes, mailboxes,
is_subscribed,
hash_indexes: Arc::new(Mutex::new(hash_indexes)), hash_indexes: Arc::new(Mutex::new(hash_indexes)),
mailbox_index: Default::default(), mailbox_index: Default::default(),
event_consumer, event_consumer,

@ -1276,7 +1276,7 @@ macro_rules! get_conf_val {
impl MboxType { impl MboxType {
pub fn new( pub fn new(
s: &AccountSettings, s: &AccountSettings,
_is_subscribed: Box<dyn Fn(&str) -> bool>, _is_subscribed: IsSubscribedFn,
event_consumer: BackendEventConsumer, event_consumer: BackendEventConsumer,
) -> Result<Box<Self>> { ) -> Result<Box<Self>> {
let path = Path::new(s.root_mailbox.as_str()).expand(); let path = Path::new(s.root_mailbox.as_str()).expand();

@ -131,6 +131,7 @@ pub struct UIDStore {
pub store: Arc<FutureMutex<Option<store::Store>>>, pub store: Arc<FutureMutex<Option<store::Store>>>,
pub mailboxes: Arc<FutureMutex<HashMap<MailboxHash, NntpMailbox>>>, pub mailboxes: Arc<FutureMutex<HashMap<MailboxHash, NntpMailbox>>>,
pub is_online: Arc<FutureMutex<(Instant, Result<()>)>>, pub is_online: Arc<FutureMutex<(Instant, Result<()>)>>,
pub is_subscribed: IsSubscribedFn,
pub event_consumer: BackendEventConsumer, pub event_consumer: BackendEventConsumer,
} }
@ -155,17 +156,16 @@ impl UIDStore {
Instant::now(), Instant::now(),
Err(Error::new("Account is uninitialised.")), Err(Error::new("Account is uninitialised.")),
))), ))),
is_subscribed: IsSubscribedFn::default(),
} }
} }
} }
#[derive(Debug)] #[derive(Debug)]
pub struct NntpType { pub struct NntpType {
pub _is_subscribed: Arc<IsSubscribedFn>,
pub connection: Arc<FutureMutex<NntpConnection>>, pub connection: Arc<FutureMutex<NntpConnection>>,
pub server_conf: NntpServerConf, pub server_conf: NntpServerConf,
pub uid_store: Arc<UIDStore>, pub uid_store: Arc<UIDStore>,
pub _can_create_flags: Arc<Mutex<bool>>,
} }
impl MailBackend for NntpType { impl MailBackend for NntpType {
@ -651,7 +651,7 @@ impl MailBackend for NntpType {
impl NntpType { impl NntpType {
pub fn new( pub fn new(
s: &AccountSettings, s: &AccountSettings,
is_subscribed: Box<dyn Fn(&str) -> bool + Send + Sync>, is_subscribed: IsSubscribedFn,
event_consumer: BackendEventConsumer, event_consumer: BackendEventConsumer,
) -> Result<Box<Self>> { ) -> Result<Box<Self>> {
let server_hostname = get_conf_val!(s["server_hostname"])?; let server_hostname = get_conf_val!(s["server_hostname"])?;
@ -735,14 +735,13 @@ impl NntpType {
} else { } else {
Default::default() Default::default()
}, },
is_subscribed,
..UIDStore::new(account_hash, account_name, event_consumer) ..UIDStore::new(account_hash, account_name, event_consumer)
}); });
let connection = NntpConnection::new_connection(&server_conf, uid_store.clone()); let connection = NntpConnection::new_connection(&server_conf, uid_store.clone());
Ok(Box::new(Self { Ok(Box::new(Self {
server_conf, server_conf,
_is_subscribed: Arc::new(IsSubscribedFn(is_subscribed)),
_can_create_flags: Arc::new(Mutex::new(false)),
connection: Arc::new(FutureMutex::new(connection)), connection: Arc::new(FutureMutex::new(connection)),
uid_store, uid_store,
})) }))

@ -274,7 +274,7 @@ impl NotmuchDb {
pub fn new( pub fn new(
s: &AccountSettings, s: &AccountSettings,
_is_subscribed: Box<dyn Fn(&str) -> bool>, _is_subscribed: IsSubscribedFn,
event_consumer: BackendEventConsumer, event_consumer: BackendEventConsumer,
) -> Result<Box<Self>> { ) -> Result<Box<Self>> {
let mut dlpath = Cow::Borrowed(Self::DEFAULT_DYLIB_NAME); let mut dlpath = Cow::Borrowed(Self::DEFAULT_DYLIB_NAME);

Loading…
Cancel
Save