From f56b89dde3db4ed2948f360f5003528c85db1965 Mon Sep 17 00:00:00 2001 From: Manos Pitsidianakis Date: Wed, 6 Nov 2019 14:53:12 +0200 Subject: [PATCH] melib: add as_any() method to MailBackend trait Cast the trait object into an &Any object. Then we can downcast it to its actual type with downcast_ref(). --- melib/src/backends.rs | 3 +++ melib/src/backends/imap.rs | 4 ++++ melib/src/backends/maildir/backend.rs | 4 ++++ melib/src/backends/mbox.rs | 4 ++++ 4 files changed, 15 insertions(+) diff --git a/melib/src/backends.rs b/melib/src/backends.rs index 1649bad2..3bd39001 100644 --- a/melib/src/backends.rs +++ b/melib/src/backends.rs @@ -36,6 +36,7 @@ use self::maildir::MaildirType; #[cfg(feature = "mbox_backend")] use self::mbox::MboxType; use super::email::{Envelope, EnvelopeHash, Flag}; +use std::any::Any; use std::fmt; use std::fmt::Debug; use std::ops::Deref; @@ -191,6 +192,8 @@ pub trait MailBackend: ::std::fmt::Debug + Send + Sync { fn folder_operation(&mut self, _path: &str, _op: FolderOperation) -> Result<()> { Ok(()) } + + fn as_any(&self) -> &dyn Any; } /// A `BackendOp` manages common operations for the various mail backends. They only live for the diff --git a/melib/src/backends/imap.rs b/melib/src/backends/imap.rs index 96addca3..aaad3d66 100644 --- a/melib/src/backends/imap.rs +++ b/melib/src/backends/imap.rs @@ -358,6 +358,10 @@ impl MailBackend for ImapType { } Ok(()) } + + fn as_any(&self) -> &dyn::std::any::Any { + self + } } macro_rules! get_conf_val { diff --git a/melib/src/backends/maildir/backend.rs b/melib/src/backends/maildir/backend.rs index 75a20aa3..7f198e3b 100644 --- a/melib/src/backends/maildir/backend.rs +++ b/melib/src/backends/maildir/backend.rs @@ -552,6 +552,10 @@ impl MailBackend for MaildirType { folder ))) } + + fn as_any(&self) -> &dyn::std::any::Any { + self + } } impl MaildirType { diff --git a/melib/src/backends/mbox.rs b/melib/src/backends/mbox.rs index 06d78df6..a1548f0b 100644 --- a/melib/src/backends/mbox.rs +++ b/melib/src/backends/mbox.rs @@ -548,6 +548,10 @@ impl MailBackend for MboxType { fn save(&self, _bytes: &[u8], _folder: &str, _flags: Option) -> Result<()> { unimplemented!(); } + + fn as_any(&self) -> &dyn::std::any::Any { + self + } } impl MboxType {