use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct PerformanceConfig {
#[serde(default)]
pub worker_threads: Option<usize>,
#[serde(default = "default_pool_size")]
pub imap_pool_size: usize,
#[serde(default = "default_pool_size")]
pub smtp_pool_size: usize,
#[serde(default = "default_buffer_kb")]
pub read_buffer_kb: usize,
#[serde(default = "default_buffer_kb")]
pub write_buffer_kb: usize,
}
fn default_pool_size() -> usize {
64
}
fn default_buffer_kb() -> usize {
64
}
impl Default for PerformanceConfig {
fn default() -> Self {
Self {
worker_threads: None,
imap_pool_size: default_pool_size(),
smtp_pool_size: default_pool_size(),
read_buffer_kb: default_buffer_kb(),
write_buffer_kb: default_buffer_kb(),
}
}
}
impl PerformanceConfig {
pub fn validate(&self) -> anyhow::Result<()> {
if let Some(threads) = self.worker_threads {
if threads == 0 {
anyhow::bail!("performance.worker_threads must be greater than 0");
}
}
if self.imap_pool_size == 0 {
anyhow::bail!("performance.imap_pool_size must be greater than 0");
}
if self.smtp_pool_size == 0 {
anyhow::bail!("performance.smtp_pool_size must be greater than 0");
}
if self.read_buffer_kb == 0 {
anyhow::bail!("performance.read_buffer_kb must be greater than 0");
}
if self.write_buffer_kb == 0 {
anyhow::bail!("performance.write_buffer_kb must be greater than 0");
}
Ok(())
}
pub fn effective_worker_threads(&self) -> usize {
self.worker_threads.unwrap_or_else(|| {
std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(1)
})
}
}