Trait email::backend::MapBackendFeature
source · pub trait MapBackendFeature<B>where
Self: BackendContextBuilder,
Self::Context: FindBackendSubcontext<B::Context> + 'static,
B: BackendContextBuilder,
B::Context: BackendContext + 'static,{
Show 19 methods
// Provided methods
fn map_feature<T: ?Sized + 'static>(
&self,
f: BackendFeatureBuilder<B::Context, T>
) -> BackendFeatureBuilder<Self::Context, T> { ... }
fn add_folder_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn AddFolder> { ... }
fn list_folders_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn ListFolders> { ... }
fn expunge_folder_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn ExpungeFolder> { ... }
fn purge_folder_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn PurgeFolder> { ... }
fn delete_folder_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn DeleteFolder> { ... }
fn get_envelope_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn GetEnvelope> { ... }
fn list_envelopes_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn ListEnvelopes> { ... }
fn watch_envelopes_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn WatchEnvelopes> { ... }
fn add_flags_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn AddFlags> { ... }
fn set_flags_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn SetFlags> { ... }
fn remove_flags_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn RemoveFlags> { ... }
fn add_message_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn AddMessage> { ... }
fn send_message_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn SendMessage> { ... }
fn get_messages_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn GetMessages> { ... }
fn peek_messages_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn PeekMessages> { ... }
fn copy_messages_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn CopyMessages> { ... }
fn move_messages_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn MoveMessages> { ... }
fn delete_messages_from(
&self,
cb: Option<&B>
) -> BackendFeatureBuilder<Self::Context, dyn DeleteMessages> { ... }
}
Expand description
Map a feature from a subcontext to a context.
A good use case is when you have a custom backend context composed
of multiple subcontexts. When implementing the
BackendContextBuilder
trait for your custom backend context,
you will have to forward backend features using the right
subcontext.
use std::sync::Arc;
use async_trait::async_trait;
use email::imap::{ImapContextSync, ImapContextBuilder};
use email::smtp::{SmtpContextSync, SmtpContextBuilder};
use email::backend::{BackendContextBuilder, FindBackendSubcontext, BackendFeatureBuilder, MapBackendFeature, macros::BackendContext};
use email::account::config::AccountConfig;
use email::folder::list::ListFolders;
use email::Result;
#[derive(BackendContext)]
struct MyContext {
imap: Option<ImapContextSync>,
smtp: Option<SmtpContextSync>,
}
impl FindBackendSubcontext<ImapContextSync> for MyContext {
fn find_subcontext(&self) -> Option<&ImapContextSync> {
self.imap.as_ref()
}
}
impl FindBackendSubcontext<SmtpContextSync> for MyContext {
fn find_subcontext(&self) -> Option<&SmtpContextSync> {
self.smtp.as_ref()
}
}
#[derive(Clone)]
struct MyContextBuilder {
imap: Option<ImapContextBuilder>,
smtp: Option<SmtpContextBuilder>,
}
#[async_trait]
impl BackendContextBuilder for MyContextBuilder {
type Context = MyContext;
fn list_folders(&self) -> BackendFeatureBuilder<Self::Context, dyn ListFolders> {
// This is how you can map a
// `BackendFeatureBuilder<ImapContextSync, dyn ListFolders>` to a
// `BackendFeatureBuilder<Self::Context, dyn ListFolders>`:
self.list_folders_from(self.imap.as_ref())
}
async fn build(self, account_config: Arc<AccountConfig>) -> Result<Self::Context> {
let imap = match self.imap {
Some(imap) => Some(imap.build(account_config.clone()).await?),
None => None,
};
let smtp = match self.smtp {
Some(smtp) => Some(smtp.build(account_config).await?),
None => None,
};
Ok(MyContext { imap, smtp })
}
}
Provided Methods§
fn map_feature<T: ?Sized + 'static>( &self, f: BackendFeatureBuilder<B::Context, T> ) -> BackendFeatureBuilder<Self::Context, T>
fn add_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn AddFolder>
fn list_folders_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn ListFolders>
fn expunge_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn ExpungeFolder>
fn purge_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn PurgeFolder>
fn delete_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn DeleteFolder>
fn get_envelope_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn GetEnvelope>
fn list_envelopes_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn ListEnvelopes>
fn watch_envelopes_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn WatchEnvelopes>
fn add_flags_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn AddFlags>
fn set_flags_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn SetFlags>
fn remove_flags_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn RemoveFlags>
fn add_message_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn AddMessage>
fn send_message_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn SendMessage>
fn get_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn GetMessages>
fn peek_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn PeekMessages>
fn copy_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn CopyMessages>
fn move_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn MoveMessages>
fn delete_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn DeleteMessages>
Object Safety§
This trait is not object safe.
Implementors§
impl<T, B> MapBackendFeature<B> for Twhere
T: BackendContextBuilder,
T::Context: FindBackendSubcontext<B::Context> + 'static,
B: BackendContextBuilder,
B::Context: BackendContext + 'static,
Generic implementation for the backend context builder with a
context implementing FindBackendSubcontext
.