pub trait MapBackendFeature<B>{
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§

source

fn map_feature<T: ?Sized + 'static>( &self, f: BackendFeatureBuilder<B::Context, T> ) -> BackendFeatureBuilder<Self::Context, T>

source

fn add_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn AddFolder>

source

fn list_folders_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn ListFolders>

source

fn expunge_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn ExpungeFolder>

source

fn purge_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn PurgeFolder>

source

fn delete_folder_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn DeleteFolder>

source

fn get_envelope_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn GetEnvelope>

source

fn list_envelopes_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn ListEnvelopes>

source

fn watch_envelopes_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn WatchEnvelopes>

source

fn add_flags_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn AddFlags>

source

fn set_flags_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn SetFlags>

source

fn remove_flags_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn RemoveFlags>

source

fn add_message_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn AddMessage>

source

fn send_message_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn SendMessage>

source

fn get_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn GetMessages>

source

fn peek_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn PeekMessages>

source

fn copy_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn CopyMessages>

source

fn move_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn MoveMessages>

source

fn delete_messages_from( &self, cb: Option<&B> ) -> BackendFeatureBuilder<Self::Context, dyn DeleteMessages>

Object Safety§

This trait is not object safe.

Implementors§

source§

impl<T, B> MapBackendFeature<B> for T

Generic implementation for the backend context builder with a context implementing FindBackendSubcontext.