Skip to main content

auditaur_core/
config.rs

1use std::path::PathBuf;
2
3use directories::BaseDirs;
4use thiserror::Error;
5
6pub const AUDITAUR_DATA_DIR_ENV: &str = "AUDITAUR_DATA_DIR";
7
8#[derive(Debug, Error)]
9pub enum ConfigError {
10    #[error("could not resolve local data directory")]
11    LocalDataDirUnavailable,
12}
13
14#[derive(Debug, Clone)]
15pub struct AuditaurConfig {
16    pub enabled: Option<bool>,
17    pub service_name: Option<String>,
18    pub service_version: Option<String>,
19    pub session_name: Option<String>,
20    pub data_dir: Option<PathBuf>,
21    pub redact_defaults: bool,
22    pub extra_redaction_keys: Vec<String>,
23    pub capture_full_payloads: bool,
24    pub max_payload_bytes: usize,
25    pub max_session_bytes: u64,
26    pub heartbeat_interval_ms: u64,
27    pub allow_release_builds: bool,
28}
29
30impl Default for AuditaurConfig {
31    fn default() -> Self {
32        Self {
33            enabled: None,
34            service_name: None,
35            service_version: None,
36            session_name: None,
37            data_dir: None,
38            redact_defaults: true,
39            extra_redaction_keys: Vec::new(),
40            capture_full_payloads: false,
41            max_payload_bytes: 16 * 1024,
42            max_session_bytes: 256 * 1024 * 1024,
43            heartbeat_interval_ms: 5_000,
44            allow_release_builds: false,
45        }
46    }
47}
48
49pub fn resolve_data_dir(configured: Option<&PathBuf>) -> Result<PathBuf, ConfigError> {
50    if let Some(data_dir) = configured {
51        return Ok(data_dir.clone());
52    }
53    if let Ok(data_dir) = std::env::var(AUDITAUR_DATA_DIR_ENV) {
54        return Ok(PathBuf::from(data_dir));
55    }
56    let base_dirs = BaseDirs::new().ok_or(ConfigError::LocalDataDirUnavailable)?;
57    Ok(base_dirs.data_local_dir().join("auditaur"))
58}