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

@ -79,7 +79,7 @@ pub trait PublicInbox {
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(
&account_conf.account,
Box::new(|_| true),
Default::default(),
melib::BackendEventConsumer::new(std::sync::Arc::new(|_, _| ())),
)?;

@ -62,11 +62,7 @@ pub mod prelude {
use prelude::*;
pub type BackendCreator = Box<
dyn Fn(
&AccountSettings,
Box<dyn Fn(&str) -> bool + Send + Sync>,
BackendEventConsumer,
) -> Result<Box<dyn MailBackend>>,
dyn Fn(&AccountSettings, IsSubscribedFn, BackendEventConsumer) -> Result<Box<dyn MailBackend>>,
>;
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)]
pub enum FlagOp {
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 {
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 {
type Target = Box<dyn Fn(&str) -> bool + Send + Sync>;
fn deref(&self) -> &Box<dyn Fn(&str) -> bool + Send + Sync> {
&self.0
type Target = dyn Fn(&str) -> bool + Send + Sync;
fn deref(&self) -> &Self::Target {
self.0.as_ref()
}
}

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

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

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

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

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

Loading…
Cancel
Save