imap_client/client/
mod.rspub mod tokio;
use std::time::Duration;
use imap_next::{
client::Options as ClientOptions,
imap_types::{auth::AuthMechanism, core::Vec1, response::Capability},
};
use crate::tasks::resolver::Resolver;
pub struct Client {
resolver: Resolver,
capabilities: Vec1<Capability<'static>>,
idle_timeout: Duration,
}
impl Client {
pub fn new(opts: ClientOptions) -> Self {
let client = imap_next::client::Client::new(opts);
let resolver = Resolver::new(client);
Self {
resolver,
capabilities: Vec1::from(Capability::Imap4Rev1),
idle_timeout: Duration::from_secs(5 * 60), }
}
pub fn get_idle_timeout(&self) -> &Duration {
&self.idle_timeout
}
pub fn set_idle_timeout(&mut self, timeout: Duration) {
self.idle_timeout = timeout;
}
pub fn set_some_idle_timeout(&mut self, timeout: Option<Duration>) {
if let Some(timeout) = timeout {
self.set_idle_timeout(timeout)
}
}
pub fn with_idle_timeout(mut self, timeout: Duration) -> Self {
self.set_idle_timeout(timeout);
self
}
pub fn with_some_idle_timeout(mut self, timeout: Option<Duration>) -> Self {
self.set_some_idle_timeout(timeout);
self
}
pub fn capabilities(&self) -> &Vec1<Capability<'static>> {
&self.capabilities
}
pub fn capabilities_iter(&self) -> impl Iterator<Item = &Capability<'static>> + '_ {
self.capabilities().as_ref().iter()
}
pub fn supported_auth_mechanisms(&self) -> impl Iterator<Item = &AuthMechanism<'static>> + '_ {
self.capabilities_iter().filter_map(|capability| {
if let Capability::Auth(mechanism) = capability {
Some(mechanism)
} else {
None
}
})
}
pub fn supports_auth_mechanism(&self, mechanism: AuthMechanism<'static>) -> bool {
self.capabilities_iter().any(|capability| {
if let Capability::Auth(m) = capability {
m == &mechanism
} else {
false
}
})
}
pub fn login_supported(&self) -> bool {
!self
.capabilities_iter()
.any(|c| matches!(c, Capability::LoginDisabled))
}
pub fn ext_enable_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::Enable))
}
pub fn ext_sasl_ir_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::SaslIr))
}
pub fn ext_id_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::Id))
}
pub fn ext_uidplus_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::UidPlus))
}
pub fn ext_sort_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::Sort(_)))
}
pub fn ext_thread_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::Thread(_)))
}
pub fn ext_idle_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::Idle))
}
pub fn ext_binary_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::Binary))
}
pub fn ext_move_supported(&self) -> bool {
self.capabilities_iter()
.any(|c| matches!(c, Capability::Move))
}
}