use crate::{FilesystemQueueManagerExt, QueueID};
use anyhow::Context;
use vsmtp_common::transport::DeserializerFn;
use vsmtp_config::Config;
extern crate alloc;
pub struct QueueManager {
config: alloc::sync::Arc<Config>,
transport_deserializer: Vec<DeserializerFn>,
}
impl core::fmt::Debug for QueueManager {
#[inline]
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.debug_struct("QueueManager").finish_non_exhaustive()
}
}
#[allow(clippy::missing_trait_methods)]
#[async_trait::async_trait]
impl FilesystemQueueManagerExt for QueueManager {
#[inline]
fn init(
config: alloc::sync::Arc<Config>,
transport_deserializer: Vec<DeserializerFn>,
) -> anyhow::Result<alloc::sync::Arc<Self>> {
<QueueID as strum::IntoEnumIterator>::iter()
.map(|q| {
let dir = Self::get_root_folder(&config, &q).join(q.to_string());
std::fs::create_dir_all(&dir).with_context(|| {
format!("could not create `{q}` directory at `{}`", dir.display())
})
})
.collect::<anyhow::Result<Vec<_>>>()?;
Ok(alloc::sync::Arc::new(Self {
config,
transport_deserializer,
}))
}
#[inline]
fn get_config(&self) -> &Config {
&self.config
}
#[inline]
fn get_transport_deserializer(&self) -> &[DeserializerFn] {
&self.transport_deserializer
}
}
#[cfg(test)]
mod tests {
use vsmtp_test::config::local_test;
extern crate alloc;
#[test]
fn debug() {
assert_eq!(
"QueueManager { .. }",
format!(
"{:?}",
<super::QueueManager as crate::GenericQueueManager>::init(
alloc::sync::Arc::new(local_test()),
vec![]
)
.unwrap()
)
);
}
}