diff --git a/src/account/config.rs b/src/account/config.rs index 2b53a1e..43dc4c6 100644 --- a/src/account/config.rs +++ b/src/account/config.rs @@ -204,10 +204,10 @@ impl TomlAccountConfig { #[cfg(feature = "message-delete")] pub fn delete_messages_kind(&self) -> Option<&BackendKind> { - self.flag + self.message .as_ref() - .and_then(|flag| flag.remove.as_ref()) - .and_then(|remove| remove.backend.as_ref()) + .and_then(|message| message.delete.as_ref()) + .and_then(|delete| delete.backend.as_ref()) .or_else(|| self.backend.as_ref()) } diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 679151a..dbb6c89 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -81,7 +81,7 @@ use email::sendmail::SendmailContext; #[cfg(feature = "smtp")] use email::smtp::{SmtpClientBuilder, SmtpClientSync}; -#[cfg(any(feature = "flag-command"))] +#[allow(unused)] use email::{ envelope::Id, flag::{Flag, Flags}, diff --git a/src/email/message/command/copy.rs b/src/email/message/command/copy.rs index e858068..acf2334 100644 --- a/src/email/message/command/copy.rs +++ b/src/email/message/command/copy.rs @@ -8,6 +8,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -57,7 +58,7 @@ impl MessageCopyCommand { &toml_account_config, &account_config, copy_messages_kind, - |builder| match copy_messages_kind { + |#[allow(unused)] builder| match copy_messages_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder diff --git a/src/email/message/command/delete.rs b/src/email/message/command/delete.rs index 4816a09..28b8e33 100644 --- a/src/email/message/command/delete.rs +++ b/src/email/message/command/delete.rs @@ -8,6 +8,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -58,7 +59,7 @@ impl MessageDeleteCommand { &toml_account_config, &account_config, delete_messages_kind, - |builder| match delete_messages_kind { + |#[allow(unused)] builder| match delete_messages_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder diff --git a/src/email/message/command/forward.rs b/src/email/message/command/forward.rs index 19b75d2..ffec3a0 100644 --- a/src/email/message/command/forward.rs +++ b/src/email/message/command/forward.rs @@ -12,6 +12,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -70,7 +71,7 @@ impl MessageForwardCommand { &toml_account_config, &account_config, add_message_kind.into_iter().chain(send_message_kind), - |builder| { + |#[allow(unused)] builder| { match add_message_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { diff --git a/src/email/message/command/move_.rs b/src/email/message/command/move_.rs index 67f574d..6a16d99 100644 --- a/src/email/message/command/move_.rs +++ b/src/email/message/command/move_.rs @@ -8,6 +8,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -57,7 +58,7 @@ impl MessageMoveCommand { &toml_account_config, &account_config, move_messages_kind, - |builder| match move_messages_kind { + |#[allow(unused)] builder| match move_messages_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder diff --git a/src/email/message/command/read.rs b/src/email/message/command/read.rs index e17936d..cd8563a 100644 --- a/src/email/message/command/read.rs +++ b/src/email/message/command/read.rs @@ -9,6 +9,7 @@ use mml::message::FilterParts; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -102,7 +103,7 @@ impl MessageReadCommand { &toml_account_config, &account_config, get_messages_kind, - |builder| match get_messages_kind { + |#[allow(unused)] builder| match get_messages_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder diff --git a/src/email/message/command/reply.rs b/src/email/message/command/reply.rs index 8dc56ea..5289ca9 100644 --- a/src/email/message/command/reply.rs +++ b/src/email/message/command/reply.rs @@ -1,6 +1,5 @@ use anyhow::{anyhow, Result}; use clap::Parser; -use email::flag::Flag; #[cfg(feature = "imap")] use email::message::add::imap::AddMessageImap; #[cfg(feature = "maildir")] @@ -13,6 +12,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -73,7 +73,7 @@ impl MessageReplyCommand { &toml_account_config, &account_config, add_message_kind.into_iter().chain(send_message_kind), - |builder| { + |#[allow(unused)] builder| { match add_message_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { @@ -130,9 +130,6 @@ impl MessageReplyCommand { .with_reply_all(self.reply.all) .build() .await?; - editor::edit_tpl_with_editor(&account_config, printer, &backend, tpl).await?; - - // TODO: let backend.send_reply_message adding the flag - backend.add_flag(&folder, &[id], Flag::Answered).await + editor::edit_tpl_with_editor(&account_config, printer, &backend, tpl).await } } diff --git a/src/email/message/command/save.rs b/src/email/message/command/save.rs index 1eb4ae4..ee17123 100644 --- a/src/email/message/command/save.rs +++ b/src/email/message/command/save.rs @@ -9,6 +9,7 @@ use std::io::{self, BufRead, IsTerminal}; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -55,7 +56,7 @@ impl MessageSaveCommand { &toml_account_config, &account_config, add_message_kind, - |builder| match add_message_kind { + |#[allow(unused)] builder| match add_message_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder.set_add_message(|ctx| ctx.imap.as_ref().and_then(AddMessageImap::new)); diff --git a/src/email/message/command/send.rs b/src/email/message/command/send.rs index 4e6c729..49c476f 100644 --- a/src/email/message/command/send.rs +++ b/src/email/message/command/send.rs @@ -1,5 +1,9 @@ use anyhow::Result; use clap::Parser; +#[cfg(feature = "imap")] +use email::message::add_with_flags::imap::AddMessageWithFlagsImap; +#[cfg(feature = "maildir")] +use email::message::add_with_flags::maildir::AddMessageWithFlagsMaildir; #[cfg(feature = "sendmail")] use email::message::send::sendmail::SendMessageSendmail; #[cfg(feature = "smtp")] @@ -9,6 +13,7 @@ use std::io::{self, BufRead, IsTerminal}; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -46,11 +51,43 @@ impl MessageSendCommand { let send_message_kind = toml_account_config.send_message_kind(); + #[cfg(feature = "message-add")] + let add_message_kind = toml_account_config + .add_message_kind() + .filter(|_| account_config.should_save_copy_sent_message()); + #[cfg(not(feature = "message-add"))] + let add_message_kind = None; + let backend = Backend::new( &toml_account_config, &account_config, - send_message_kind, - |builder| { + send_message_kind.into_iter().chain(add_message_kind), + |#[allow(unused)] builder| { + match add_message_kind { + #[cfg(feature = "imap")] + Some(BackendKind::Imap) => { + builder.set_add_message_with_flags(|ctx| { + ctx.imap.as_ref().and_then(AddMessageWithFlagsImap::new) + }); + } + #[cfg(feature = "maildir")] + Some(BackendKind::Maildir) => { + builder.set_add_message_with_flags(|ctx| { + ctx.maildir + .as_ref() + .and_then(AddMessageWithFlagsMaildir::new) + }); + } + #[cfg(feature = "sync")] + Some(BackendKind::MaildirForSync) => { + builder.set_add_message_with_flags(|ctx| { + ctx.maildir_for_sync + .as_ref() + .and_then(AddMessageWithFlagsMaildir::new) + }); + } + _ => (), + }; match send_message_kind { #[cfg(feature = "smtp")] Some(BackendKind::Smtp) => { diff --git a/src/email/message/command/write.rs b/src/email/message/command/write.rs index 18bccda..c5b243a 100644 --- a/src/email/message/command/write.rs +++ b/src/email/message/command/write.rs @@ -13,6 +13,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -61,7 +62,7 @@ impl MessageWriteCommand { &toml_account_config, &account_config, add_message_kind.into_iter().chain(send_message_kind), - |builder| { + |#[allow(unused)] builder| { match add_message_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { diff --git a/src/email/message/config.rs b/src/email/message/config.rs index a150e3a..695e1cd 100644 --- a/src/email/message/config.rs +++ b/src/email/message/config.rs @@ -18,6 +18,8 @@ pub struct MessageConfig { #[cfg(feature = "message-move")] #[serde(rename = "move")] pub move_: Option, + #[cfg(feature = "message-delete")] + pub delete: Option, } impl MessageConfig { @@ -181,3 +183,22 @@ impl MessageMoveConfig { kinds } } + +#[cfg(feature = "message-delete")] +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct MessageDeleteConfig { + pub backend: Option, +} + +#[cfg(feature = "message-delete")] +impl MessageDeleteConfig { + pub fn get_used_backends(&self) -> HashSet<&BackendKind> { + let mut kinds = HashSet::default(); + + if let Some(kind) = &self.backend { + kinds.insert(kind); + } + + kinds + } +} diff --git a/src/email/message/template/command/forward.rs b/src/email/message/template/command/forward.rs index 379f40e..9409641 100644 --- a/src/email/message/template/command/forward.rs +++ b/src/email/message/template/command/forward.rs @@ -8,6 +8,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -63,7 +64,7 @@ impl TemplateForwardCommand { &toml_account_config, &account_config, get_messages_kind, - |builder| match get_messages_kind { + |#[allow(unused)] builder| match get_messages_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder diff --git a/src/email/message/template/command/reply.rs b/src/email/message/template/command/reply.rs index 928c6b5..f91f42b 100644 --- a/src/email/message/template/command/reply.rs +++ b/src/email/message/template/command/reply.rs @@ -8,6 +8,7 @@ use log::info; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -68,7 +69,7 @@ impl TemplateReplyCommand { &toml_account_config, &account_config, get_messages_kind, - |builder| match get_messages_kind { + |#[allow(unused)] builder| match get_messages_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder diff --git a/src/email/message/template/command/save.rs b/src/email/message/template/command/save.rs index 93120f6..08c66b2 100644 --- a/src/email/message/template/command/save.rs +++ b/src/email/message/template/command/save.rs @@ -10,6 +10,7 @@ use std::io::{self, BufRead, IsTerminal}; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -59,7 +60,7 @@ impl TemplateSaveCommand { &toml_account_config, &account_config, add_message_kind, - |builder| match add_message_kind { + |#[allow(unused)] builder| match add_message_kind { #[cfg(feature = "imap")] Some(BackendKind::Imap) => { builder.set_add_message(|ctx| ctx.imap.as_ref().and_then(AddMessageImap::new)); diff --git a/src/email/message/template/command/send.rs b/src/email/message/template/command/send.rs index 77281a7..6d9e6aa 100644 --- a/src/email/message/template/command/send.rs +++ b/src/email/message/template/command/send.rs @@ -1,5 +1,9 @@ use anyhow::Result; use clap::Parser; +#[cfg(feature = "imap")] +use email::message::add_with_flags::imap::AddMessageWithFlagsImap; +#[cfg(feature = "maildir")] +use email::message::add_with_flags::maildir::AddMessageWithFlagsMaildir; #[cfg(feature = "sendmail")] use email::message::send::sendmail::SendMessageSendmail; #[cfg(feature = "smtp")] @@ -10,6 +14,7 @@ use std::io::{self, BufRead, IsTerminal}; #[cfg(feature = "sync")] use crate::cache::arg::disable::CacheDisableFlag; +#[allow(unused)] use crate::{ account::arg::name::AccountNameFlag, backend::{Backend, BackendKind}, @@ -49,11 +54,43 @@ impl TemplateSendCommand { let send_message_kind = toml_account_config.send_message_kind(); + #[cfg(feature = "message-add")] + let add_message_kind = toml_account_config + .add_message_kind() + .filter(|_| account_config.should_save_copy_sent_message()); + #[cfg(not(feature = "message-add"))] + let add_message_kind = None; + let backend = Backend::new( &toml_account_config, &account_config, - send_message_kind, - |builder| { + send_message_kind.into_iter().chain(add_message_kind), + |#[allow(unused)] builder| { + match add_message_kind { + #[cfg(feature = "imap")] + Some(BackendKind::Imap) => { + builder.set_add_message_with_flags(|ctx| { + ctx.imap.as_ref().and_then(AddMessageWithFlagsImap::new) + }); + } + #[cfg(feature = "maildir")] + Some(BackendKind::Maildir) => { + builder.set_add_message_with_flags(|ctx| { + ctx.maildir + .as_ref() + .and_then(AddMessageWithFlagsMaildir::new) + }); + } + #[cfg(feature = "sync")] + Some(BackendKind::MaildirForSync) => { + builder.set_add_message_with_flags(|ctx| { + ctx.maildir_for_sync + .as_ref() + .and_then(AddMessageWithFlagsMaildir::new) + }); + } + _ => (), + }; match send_message_kind { #[cfg(feature = "smtp")] Some(BackendKind::Smtp) => { diff --git a/src/folder/mod.rs b/src/folder/mod.rs index 4390e4e..80bc6c6 100644 --- a/src/folder/mod.rs +++ b/src/folder/mod.rs @@ -1,4 +1,3 @@ -#[cfg(feature = "folder-command")] pub mod arg; #[cfg(feature = "folder-command")] pub mod command;