From 20f6973c55528f34e07ba20432c6219da9c4917e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20DOUIN?= Date: Mon, 27 Nov 2023 15:49:55 +0100 Subject: [PATCH] plug missing other backend features --- src/backend.rs | 261 ++++++++++++++++++++++- src/domain/account/config.rs | 8 +- src/domain/email/envelope/config.rs | 6 + src/domain/email/envelope/flag/config.rs | 25 +++ src/domain/email/envelope/flag/mod.rs | 1 + src/domain/email/envelope/mod.rs | 1 + src/domain/email/message/config.rs | 31 +++ 7 files changed, 329 insertions(+), 4 deletions(-) create mode 100644 src/domain/email/envelope/flag/config.rs create mode 100644 src/domain/email/envelope/flag/mod.rs diff --git a/src/backend.rs b/src/backend.rs index 588af4e..c30805a 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -11,8 +11,26 @@ use email::{ account::AccountConfig, config::Config, email::{ - envelope::list::{imap::ListEnvelopesImap, maildir::ListEnvelopesMaildir}, - message::send_raw::{sendmail::SendRawMessageSendmail, smtp::SendRawMessageSmtp}, + envelope::{ + get::{imap::GetEnvelopeImap, maildir::GetEnvelopeMaildir}, + list::{imap::ListEnvelopesImap, maildir::ListEnvelopesMaildir}, + }, + flag::{ + add::{imap::AddFlagsImap, maildir::AddFlagsMaildir}, + remove::{imap::RemoveFlagsImap, maildir::RemoveFlagsMaildir}, + set::{imap::SetFlagsImap, maildir::SetFlagsMaildir}, + }, + message::{ + add_raw::imap::AddRawMessageImap, + add_raw_with_flags::{ + imap::AddRawMessageWithFlagsImap, maildir::AddRawMessageWithFlagsMaildir, + }, + copy::{imap::CopyMessagesImap, maildir::CopyMessagesMaildir}, + get::imap::GetMessagesImap, + move_::{imap::MoveMessagesImap, maildir::MoveMessagesMaildir}, + peek::{imap::PeekMessagesImap, maildir::PeekMessagesMaildir}, + send_raw::{sendmail::SendRawMessageSendmail, smtp::SendRawMessageSmtp}, + }, }, folder::{ add::{imap::AddFolderImap, maildir::AddFolderMaildir}, @@ -360,6 +378,33 @@ impl BackendBuilder { _ => (), } + let get_envelope = deserialized_account_config + .envelope + .as_ref() + .and_then(|envelope| envelope.get.as_ref()) + .and_then(|get| get.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match get_envelope { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder.with_get_envelope(|ctx| { + ctx.maildir.as_ref().and_then(GetEnvelopeMaildir::new) + }); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_get_envelope(|ctx| ctx.imap.as_ref().and_then(GetEnvelopeImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder.with_get_envelope(|ctx| { + ctx.notmuch.as_ref().and_then(GetEnvelopeNotmuch::new) + }); + } + _ => (), + } + let list_envelopes = deserialized_account_config .envelope .as_ref() @@ -387,6 +432,83 @@ impl BackendBuilder { _ => (), } + let add_flags = deserialized_account_config + .flag + .as_ref() + .and_then(|flag| flag.add.as_ref()) + .and_then(|add| add.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match add_flags { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder + .with_add_flags(|ctx| ctx.maildir.as_ref().and_then(AddFlagsMaildir::new)); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_add_flags(|ctx| ctx.imap.as_ref().and_then(AddFlagsImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder + .with_add_flags(|ctx| ctx.notmuch.as_ref().and_then(AddFlagsNotmuch::new)); + } + _ => (), + } + + let set_flags = deserialized_account_config + .flag + .as_ref() + .and_then(|flag| flag.set.as_ref()) + .and_then(|set| set.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match set_flags { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder + .with_set_flags(|ctx| ctx.maildir.as_ref().and_then(SetFlagsMaildir::new)); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_set_flags(|ctx| ctx.imap.as_ref().and_then(SetFlagsImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder + .with_set_flags(|ctx| ctx.notmuch.as_ref().and_then(SetFlagsNotmuch::new)); + } + _ => (), + } + + let remove_flags = deserialized_account_config + .flag + .as_ref() + .and_then(|flag| flag.remove.as_ref()) + .and_then(|remove| remove.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match remove_flags { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder.with_remove_flags(|ctx| { + ctx.maildir.as_ref().and_then(RemoveFlagsMaildir::new) + }); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_remove_flags(|ctx| ctx.imap.as_ref().and_then(RemoveFlagsImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder.with_remove_flags(|ctx| { + ctx.notmuch.as_ref().and_then(RemoveFlagsNotmuch::new) + }); + } + _ => (), + } + let send_msg = deserialized_account_config .message .as_ref() @@ -409,6 +531,141 @@ impl BackendBuilder { _ => (), } + let add_msg = deserialized_account_config + .message + .as_ref() + .and_then(|msg| msg.add.as_ref()) + .and_then(|add| add.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match add_msg { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder.with_add_raw_message_with_flags(|ctx| { + ctx.maildir + .as_ref() + .and_then(AddRawMessageWithFlagsMaildir::new) + }); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_add_raw_message(|ctx| ctx.imap.as_ref().and_then(AddRawMessageImap::new)) + .with_add_raw_message_with_flags(|ctx| { + ctx.imap.as_ref().and_then(AddRawMessageWithFlagsImap::new) + }); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder.with_add_raw_message(|ctx| { + ctx.notmuch.as_ref().and_then(AddRawMessageNotmuch::new) + }); + } + _ => (), + } + + let peek_msgs = deserialized_account_config + .message + .as_ref() + .and_then(|msg| msg.peek.as_ref()) + .and_then(|peek| peek.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match peek_msgs { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder.with_peek_messages(|ctx| { + ctx.maildir.as_ref().and_then(PeekMessagesMaildir::new) + }); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_peek_messages(|ctx| ctx.imap.as_ref().and_then(PeekMessagesImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder.with_peek_messages(|ctx| { + ctx.notmuch.as_ref().and_then(PeekMessagesNotmuch::new) + }); + } + _ => (), + } + + let get_msgs = deserialized_account_config + .message + .as_ref() + .and_then(|msg| msg.get.as_ref()) + .and_then(|get| get.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match get_msgs { + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_get_messages(|ctx| ctx.imap.as_ref().and_then(GetMessagesImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder.with_get_messages(|ctx| { + ctx.notmuch.as_ref().and_then(GetMessagesNotmuch::new) + }); + } + _ => (), + } + + let copy_msgs = deserialized_account_config + .message + .as_ref() + .and_then(|msg| msg.copy.as_ref()) + .and_then(|copy| copy.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match copy_msgs { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder.with_copy_messages(|ctx| { + ctx.maildir.as_ref().and_then(CopyMessagesMaildir::new) + }); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_copy_messages(|ctx| ctx.imap.as_ref().and_then(CopyMessagesImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder.with_copy_messages(|ctx| { + ctx.notmuch.as_ref().and_then(CopyMessagesNotmuch::new) + }); + } + _ => (), + } + + let move_msgs = deserialized_account_config + .message + .as_ref() + .and_then(|msg| msg.move_.as_ref()) + .and_then(|move_| move_.backend.as_ref()) + .or_else(|| deserialized_account_config.backend.as_ref()); + + match move_msgs { + Some(BackendKind::Maildir) => { + backend_builder = backend_builder.with_move_messages(|ctx| { + ctx.maildir.as_ref().and_then(MoveMessagesMaildir::new) + }); + } + #[cfg(feature = "imap-backend")] + Some(BackendKind::Imap) => { + backend_builder = backend_builder + .with_move_messages(|ctx| ctx.imap.as_ref().and_then(MoveMessagesImap::new)); + } + #[cfg(feature = "notmuch-backend")] + Some(BackendKind::Notmuch) => { + backend_builder = backend_builder.with_move_messages(|ctx| { + ctx.notmuch.as_ref().and_then(MoveMessagesNotmuch::new) + }); + } + _ => (), + } + Ok(Self(backend_builder)) } } diff --git a/src/domain/account/config.rs b/src/domain/account/config.rs index ca8f841..529d9cb 100644 --- a/src/domain/account/config.rs +++ b/src/domain/account/config.rs @@ -19,8 +19,11 @@ use serde::{Deserialize, Serialize}; use std::{collections::HashMap, path::PathBuf}; use crate::{ - backend::BackendKind, config::prelude::*, domain::config::FolderConfig, - email::envelope::config::EnvelopeConfig, message::config::MessageConfig, + backend::BackendKind, + config::prelude::*, + domain::config::FolderConfig, + email::envelope::{config::EnvelopeConfig, flag::config::FlagConfig}, + message::config::MessageConfig, }; /// Represents all existing kind of account config. @@ -58,6 +61,7 @@ pub struct DeserializedAccountConfig { pub folder: Option, pub envelope: Option, + pub flag: Option, pub message: Option, #[cfg(feature = "imap-backend")] diff --git a/src/domain/email/envelope/config.rs b/src/domain/email/envelope/config.rs index a13476e..35a5629 100644 --- a/src/domain/email/envelope/config.rs +++ b/src/domain/email/envelope/config.rs @@ -5,9 +5,15 @@ use crate::backend::BackendKind; #[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] pub struct EnvelopeConfig { pub list: Option, + pub get: Option, } #[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] pub struct EnvelopeListConfig { pub backend: Option, } + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct EnvelopeGetConfig { + pub backend: Option, +} diff --git a/src/domain/email/envelope/flag/config.rs b/src/domain/email/envelope/flag/config.rs new file mode 100644 index 0000000..af01500 --- /dev/null +++ b/src/domain/email/envelope/flag/config.rs @@ -0,0 +1,25 @@ +use ::serde::{Deserialize, Serialize}; + +use crate::backend::BackendKind; + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct FlagConfig { + pub add: Option, + pub set: Option, + pub remove: Option, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct FlagAddConfig { + pub backend: Option, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct FlagSetConfig { + pub backend: Option, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct FlagRemoveConfig { + pub backend: Option, +} diff --git a/src/domain/email/envelope/flag/mod.rs b/src/domain/email/envelope/flag/mod.rs new file mode 100644 index 0000000..ef68c36 --- /dev/null +++ b/src/domain/email/envelope/flag/mod.rs @@ -0,0 +1 @@ +pub mod config; diff --git a/src/domain/email/envelope/mod.rs b/src/domain/email/envelope/mod.rs index ef68c36..abaed0b 100644 --- a/src/domain/email/envelope/mod.rs +++ b/src/domain/email/envelope/mod.rs @@ -1 +1,2 @@ pub mod config; +pub mod flag; diff --git a/src/domain/email/message/config.rs b/src/domain/email/message/config.rs index 16eb198..abb2072 100644 --- a/src/domain/email/message/config.rs +++ b/src/domain/email/message/config.rs @@ -4,10 +4,41 @@ use crate::backend::BackendKind; #[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] pub struct MessageConfig { + pub add: Option, pub send: Option, + pub peek: Option, + pub get: Option, + pub copy: Option, + #[serde(rename = "move")] + pub move_: Option, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct MessageAddConfig { + pub backend: Option, } #[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] pub struct MessageSendConfig { pub backend: Option, } + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct MessagePeekConfig { + pub backend: Option, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct MessageGetConfig { + pub backend: Option, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct MessageCopyConfig { + pub backend: Option, +} + +#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct MessageMoveConfig { + pub backend: Option, +}