From 94433cfc40de385978092e693140ecd65fb23afe Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Thu, 20 Aug 2020 21:25:12 +0300 Subject: [PATCH] melib/backends: cleanup MailBackend trait definition --- melib/src/backends.rs | 93 +++------------------------ melib/src/backends/imap.rs | 16 ++--- melib/src/backends/jmap.rs | 18 ++++-- melib/src/backends/maildir/backend.rs | 12 ++-- melib/src/backends/mbox.rs | 10 ++- melib/src/backends/nntp.rs | 16 ++--- melib/src/backends/notmuch.rs | 17 ++++- src/state.rs | 2 +- 8 files changed, 69 insertions(+), 115 deletions(-) diff --git a/melib/src/backends.rs b/melib/src/backends.rs index 62434bc5..38d11049 100644 --- a/melib/src/backends.rs +++ b/melib/src/backends.rs @@ -304,24 +304,17 @@ pub type ResultFuture = Result> + Send pub trait MailBackend: ::std::fmt::Debug + Send + Sync { fn capabilities(&self) -> MailBackendCapabilities; fn is_online(&self) -> ResultFuture<()> { - Err(MeliError::new("Unimplemented.")) + Ok(Box::pin(async { Ok(()) })) } - //fn fetch(&mut self, mailbox_hash: MailboxHash) -> Result>>>; + fn fetch( &mut self, - _mailbox_hash: MailboxHash, - ) -> Result>> + Send + 'static>>> { - Err(MeliError::new("Unimplemented.")) - } - fn refresh(&mut self, _mailbox_hash: MailboxHash) -> ResultFuture<()> { - Err(MeliError::new("Unimplemented.")) - } - fn watch(&self) -> ResultFuture<()> { - Err(MeliError::new("Unimplemented.")) - } - fn mailboxes(&self) -> ResultFuture> { - Err(MeliError::new("Unimplemented.")) - } + mailbox_hash: MailboxHash, + ) -> Result>> + Send + 'static>>>; + + fn refresh(&mut self, mailbox_hash: MailboxHash) -> ResultFuture<()>; + fn watch(&self) -> ResultFuture<()>; + fn mailboxes(&self) -> ResultFuture>; fn operation(&self, hash: EnvelopeHash) -> Result>; fn save( @@ -362,10 +355,7 @@ pub trait MailBackend: ::std::fmt::Debug + Send + Sync { None } fn as_any(&self) -> &dyn Any; - - fn as_any_mut(&mut self) -> &mut dyn Any { - unimplemented!() - } + fn as_any_mut(&mut self) -> &mut dyn Any; fn create_mailbox( &mut self, @@ -553,65 +543,6 @@ pub trait BackendMailbox: Debug { fn count(&self) -> Result<(usize, usize)>; } -#[derive(Debug)] -struct DummyMailbox { - v: Vec, -} - -impl BackendMailbox for DummyMailbox { - fn hash(&self) -> MailboxHash { - 0 - } - - fn name(&self) -> &str { - "" - } - - fn path(&self) -> &str { - "" - } - - fn change_name(&mut self, _s: &str) {} - - fn clone(&self) -> Mailbox { - mailbox_default() - } - - fn special_usage(&self) -> SpecialUsageMailbox { - SpecialUsageMailbox::Normal - } - - fn children(&self) -> &[MailboxHash] { - &self.v - } - - fn parent(&self) -> Option { - None - } - - fn permissions(&self) -> MailboxPermissions { - MailboxPermissions::default() - } - fn is_subscribed(&self) -> bool { - true - } - fn set_is_subscribed(&mut self, _new_val: bool) -> Result<()> { - Ok(()) - } - fn set_special_usage(&mut self, _new_val: SpecialUsageMailbox) -> Result<()> { - Ok(()) - } - fn count(&self) -> Result<(usize, usize)> { - Ok((0, 0)) - } -} - -pub fn mailbox_default() -> Mailbox { - Box::new(DummyMailbox { - v: Vec::with_capacity(0), - }) -} - pub type AccountHash = u64; pub type MailboxHash = u64; pub type Mailbox = Box; @@ -622,12 +553,6 @@ impl Clone for Mailbox { } } -impl Default for Mailbox { - fn default() -> Self { - mailbox_default() - } -} - #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)] pub struct MailboxPermissions { pub create_messages: bool, diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 106c1bd5..68469f96 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -709,14 +709,6 @@ impl MailBackend for ImapType { })) } - fn as_any(&self) -> &dyn ::std::any::Any { - self - } - - fn as_any_mut(&mut self) -> &mut dyn ::std::any::Any { - self - } - fn tags(&self) -> Option>>> { if *self.can_create_flags.lock().unwrap() { Some(self.uid_store.tag_index.clone()) @@ -725,6 +717,14 @@ impl MailBackend for ImapType { } } + fn as_any(&self) -> &dyn Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn Any { + self + } + fn create_mailbox( &mut self, mut path: String, diff --git a/melib/src/backends/jmap.rs b/melib/src/backends/jmap.rs index feb90b9b..ea88c3ac 100644 --- a/melib/src/backends/jmap.rs +++ b/melib/src/backends/jmap.rs @@ -242,10 +242,12 @@ impl MailBackend for JmapType { })) } + fn refresh(&mut self, _mailbox_hash: MailboxHash) -> ResultFuture<()> { + Err(MeliError::new("Unimplemented.")) + } + fn watch(&self) -> ResultFuture<()> { - Ok(Box::pin(async move { - Err(MeliError::from("JMAP watch for updates is unimplemented")) - })) + Err(MeliError::from("JMAP watch for updates is unimplemented")) } fn mailboxes(&self) -> ResultFuture> { @@ -288,12 +290,16 @@ impl MailBackend for JmapType { Err(MeliError::new("Unimplemented.")) } - fn as_any(&self) -> &dyn ::std::any::Any { + fn tags(&self) -> Option>>> { + Some(self.tag_index.clone()) + } + + fn as_any(&self) -> &dyn Any { self } - fn tags(&self) -> Option>>> { - Some(self.tag_index.clone()) + fn as_any_mut(&mut self) -> &mut dyn Any { + self } fn search( diff --git a/melib/src/backends/maildir/backend.rs b/melib/src/backends/maildir/backend.rs index 44739fc5..6a762a2f 100644 --- a/melib/src/backends/maildir/backend.rs +++ b/melib/src/backends/maildir/backend.rs @@ -812,10 +812,6 @@ impl MailBackend for MaildirType { })) } - fn as_any(&self) -> &dyn ::std::any::Any { - self - } - fn create_mailbox( &mut self, new_path: String, @@ -892,6 +888,14 @@ impl MailBackend for MaildirType { ) -> ResultFuture<()> { Err(MeliError::new("Unimplemented.")) } + + fn as_any(&self) -> &dyn Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn Any { + self + } } impl MaildirType { diff --git a/melib/src/backends/mbox.rs b/melib/src/backends/mbox.rs index 7c150cba..1fd87b3c 100644 --- a/melib/src/backends/mbox.rs +++ b/melib/src/backends/mbox.rs @@ -808,6 +808,10 @@ impl MailBackend for MboxType { })) } + fn refresh(&mut self, _mailbox_hash: MailboxHash) -> ResultFuture<()> { + Err(MeliError::new("Unimplemented.")) + } + fn watch(&self) -> ResultFuture<()> { let sender = self.event_consumer.clone(); let (tx, rx) = channel(); @@ -1004,7 +1008,11 @@ impl MailBackend for MboxType { Err(MeliError::new("Unimplemented.")) } - fn as_any(&self) -> &dyn ::std::any::Any { + fn as_any(&self) -> &dyn Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn Any { self } } diff --git a/melib/src/backends/nntp.rs b/melib/src/backends/nntp.rs index 6ef152b1..67c3c148 100644 --- a/melib/src/backends/nntp.rs +++ b/melib/src/backends/nntp.rs @@ -298,18 +298,18 @@ impl MailBackend for NntpType { Err(MeliError::new("Unimplemented.")) } - fn as_any(&self) -> &dyn ::std::any::Any { - self - } - - fn as_any_mut(&mut self) -> &mut dyn ::std::any::Any { - self - } - fn tags(&self) -> Option>>> { None } + fn as_any(&self) -> &dyn Any { + self + } + + fn as_any_mut(&mut self) -> &mut dyn Any { + self + } + fn create_mailbox( &mut self, _path: String, diff --git a/melib/src/backends/notmuch.rs b/melib/src/backends/notmuch.rs index cd1d33a5..44b0ede8 100644 --- a/melib/src/backends/notmuch.rs +++ b/melib/src/backends/notmuch.rs @@ -462,6 +462,13 @@ impl MailBackend for NotmuchDb { })) } + fn refresh(&mut self, _mailbox_hash: MailboxHash) -> ResultFuture<()> { + Err(MeliError::new("Unimplemented.")) + } + + fn watch(&self) -> ResultFuture<()> { + Err(MeliError::new("Unimplemented.")) + } /* fn watch(&self) -> ResultFuture<()> { extern crate notify; @@ -835,12 +842,16 @@ impl MailBackend for NotmuchDb { Ok(Box::pin(async { Ok(()) })) } - fn as_any(&self) -> &dyn ::std::any::Any { + fn tags(&self) -> Option>>> { + Some(self.tag_index.clone()) + } + + fn as_any(&self) -> &dyn Any { self } - fn tags(&self) -> Option>>> { - Some(self.tag_index.clone()) + fn as_any_mut(&mut self) -> &mut dyn Any { + self } } diff --git a/src/state.rs b/src/state.rs index ac4faf8b..bf584e0f 100644 --- a/src/state.rs +++ b/src/state.rs @@ -233,7 +233,7 @@ impl State { let input_thread = unbounded(); let input_thread_pipe = nix::unistd::pipe() .map_err(|err| Box::new(err) as Box)?; - let mut backends = Backends::new(); + let backends = Backends::new(); let settings = if let Some(settings) = settings { settings } else {