fix envelope listing

This commit is contained in:
Clément DOUIN
2024-01-02 12:21:12 +01:00
parent 37c352ea7f
commit a8c6756f56
6 changed files with 102 additions and 10 deletions
+15 -5
View File
@@ -84,13 +84,13 @@ impl ToString for BackendKind {
#[derive(Clone, Default)]
pub struct BackendContextBuilder {
maildir: Option<MaildirSessionBuilder>,
maildir_for_sync: Option<MaildirSessionBuilder>,
pub maildir: Option<MaildirSessionBuilder>,
pub maildir_for_sync: Option<MaildirSessionBuilder>,
#[cfg(feature = "imap")]
imap: Option<ImapSessionBuilder>,
pub imap: Option<ImapSessionBuilder>,
#[cfg(feature = "smtp")]
smtp: Option<SmtpClientBuilder>,
sendmail: Option<SendmailContext>,
pub smtp: Option<SmtpClientBuilder>,
pub sendmail: Option<SendmailContext>,
}
#[async_trait]
@@ -699,6 +699,16 @@ impl Backend {
.await
}
pub async fn new_v2(
toml_account_config: TomlAccountConfig,
builder: email::backend::BackendBuilder<BackendContextBuilder>,
) -> Result<Self> {
Ok(Self {
toml_account_config,
backend: builder.build().await?,
})
}
fn build_id_mapper(
&self,
folder: &str,
+80 -2
View File
@@ -1,10 +1,18 @@
use anyhow::Result;
use clap::Parser;
use email::backend::BackendBuilder;
#[cfg(feature = "imap")]
use email::{envelope::list::imap::ListEnvelopesImap, imap::ImapSessionBuilder};
#[cfg(feature = "maildir")]
use email::{
envelope::list::maildir::ListEnvelopesMaildir,
maildir::{config::MaildirConfig, MaildirSessionBuilder},
};
use log::info;
use crate::{
account::arg::name::AccountNameFlag,
backend::Backend,
backend::{Backend, BackendContextBuilder, BackendKind},
cache::arg::disable::CacheDisableFlag,
config::TomlConfig,
folder::arg::name::FolderNameOptionalArg,
@@ -54,7 +62,77 @@ impl ListEnvelopesCommand {
let (toml_account_config, account_config) = config
.clone()
.into_account_configs(some_account_name, self.cache.disable)?;
let backend = Backend::new(toml_account_config, account_config.clone(), false).await?;
let backend_kind = toml_account_config.list_envelopes_kind();
let backend_ctx_builder = BackendContextBuilder {
maildir: toml_account_config
.maildir
.as_ref()
.filter(|_| matches!(backend_kind, Some(BackendKind::Maildir)))
.map(|mdir_config| {
MaildirSessionBuilder::new(account_config.clone(), mdir_config.clone())
}),
maildir_for_sync: Some(MaildirConfig {
root_dir: account_config.get_sync_dir()?,
})
.filter(|_| matches!(backend_kind, Some(BackendKind::MaildirForSync)))
.map(|mdir_config| MaildirSessionBuilder::new(account_config.clone(), mdir_config)),
#[cfg(feature = "imap")]
imap: {
let ctx_builder = toml_account_config
.imap
.as_ref()
.filter(|_| matches!(backend_kind, Some(BackendKind::Imap)))
.map(|imap_config| {
ImapSessionBuilder::new(account_config.clone(), imap_config.clone())
.with_prebuilt_credentials()
});
match ctx_builder {
Some(ctx_builder) => Some(ctx_builder.await?),
None => None,
}
},
#[cfg(feature = "notmuch")]
notmuch: toml_account_config
.notmuch
.as_ref()
.filter(|_| matches!(backend_kind, Some(BackendKind::Notmuch)))
.map(|notmuch_config| {
NotmuchSessionBuilder::new(account_config.clone(), notmuch_config.clone())
}),
..Default::default()
};
let mut backend_builder = BackendBuilder::new(account_config.clone(), backend_ctx_builder);
match toml_account_config.list_envelopes_kind() {
Some(BackendKind::Maildir) => {
backend_builder = backend_builder.with_list_envelopes(|ctx| {
ctx.maildir.as_ref().and_then(ListEnvelopesMaildir::new)
});
}
Some(BackendKind::MaildirForSync) => {
backend_builder = backend_builder.with_list_envelopes(|ctx| {
ctx.maildir_for_sync
.as_ref()
.and_then(ListEnvelopesMaildir::new)
});
}
#[cfg(feature = "imap")]
Some(BackendKind::Imap) => {
backend_builder = backend_builder
.with_list_envelopes(|ctx| ctx.imap.as_ref().and_then(ListEnvelopesImap::new));
}
#[cfg(feature = "notmuch")]
Some(BackendKind::Notmuch) => {
backend_builder = backend_builder.with_list_envelopes(|ctx| {
ctx.notmuch.as_ref().and_then(ListEnvelopesNotmuch::new)
});
}
_ => (),
}
let backend = Backend::new_v2(toml_account_config.clone(), backend_builder).await?;
let page_size = self
.page_size