use std::path::PathBuf;
use std::time::Duration;
use crate::{
DEFAULT_DEDUP_VALID_AT_WINDOW_SECS, DEFAULT_LLM_TIMEOUT_SECS, DEFAULT_MAX_RETRIES_PER_RECORD,
DEFAULT_PROCESSING_STALE_SECS,
};
#[derive(Debug, Clone)]
pub struct LibrarianConfig {
pub drafts_dir: PathBuf,
pub workspace_log: PathBuf,
pub max_retries_per_record: u32,
pub llm_timeout: Duration,
pub processing_stale_after: Duration,
pub dedup_valid_at_window: Duration,
pub review_conflicts: bool,
}
impl LibrarianConfig {
#[must_use]
pub fn new(drafts_dir: PathBuf, workspace_log: PathBuf) -> Self {
Self {
drafts_dir,
workspace_log,
max_retries_per_record: DEFAULT_MAX_RETRIES_PER_RECORD,
llm_timeout: Duration::from_secs(DEFAULT_LLM_TIMEOUT_SECS),
processing_stale_after: Duration::from_secs(DEFAULT_PROCESSING_STALE_SECS),
dedup_valid_at_window: Duration::from_secs(DEFAULT_DEDUP_VALID_AT_WINDOW_SECS),
review_conflicts: false,
}
}
}
impl Default for LibrarianConfig {
fn default() -> Self {
let home = std::env::var_os("HOME").map(PathBuf::from);
let (drafts_dir, workspace_log) = if let Some(h) = home {
(h.join(".mimir/drafts"), h.join(".mimir/canonical.log"))
} else {
(PathBuf::from("./drafts"), PathBuf::from("./canonical.log"))
};
Self::new(drafts_dir, workspace_log)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_has_expected_retry_budget() {
let cfg = LibrarianConfig::default();
assert_eq!(cfg.max_retries_per_record, DEFAULT_MAX_RETRIES_PER_RECORD);
assert_eq!(
cfg.llm_timeout,
Duration::from_secs(DEFAULT_LLM_TIMEOUT_SECS)
);
assert_eq!(
cfg.processing_stale_after,
Duration::from_secs(DEFAULT_PROCESSING_STALE_SECS)
);
assert_eq!(
cfg.dedup_valid_at_window,
Duration::from_secs(DEFAULT_DEDUP_VALID_AT_WINDOW_SECS)
);
assert!(!cfg.review_conflicts);
}
#[test]
fn new_uses_explicit_paths() {
let cfg =
LibrarianConfig::new(PathBuf::from("/tmp/drafts"), PathBuf::from("/tmp/log.mimr"));
assert_eq!(cfg.drafts_dir, PathBuf::from("/tmp/drafts"));
assert_eq!(cfg.workspace_log, PathBuf::from("/tmp/log.mimr"));
assert_eq!(
cfg.dedup_valid_at_window,
Duration::from_secs(DEFAULT_DEDUP_VALID_AT_WINDOW_SECS)
);
}
}