#![allow(dead_code)]
use serde::Deserialize;
use std::path::PathBuf;
use std::sync::Arc;
#[allow(clippy::derivable_impls)]
#[derive(Debug, Clone, serde::Deserialize)]
pub struct Config {
pub monitoring: MonitoringConfig,
pub session: SessionConfig,
pub notifications: NotificationsConfig,
}
#[allow(clippy::derivable_impls)]
impl Default for Config {
fn default() -> Self {
Self {
monitoring: MonitoringConfig::default(),
session: SessionConfig::default(),
notifications: NotificationsConfig::default(),
}
}
}
#[derive(Debug, Clone, serde::Deserialize)]
pub struct MonitoringConfig {
pub poll_interval_ms: u64,
pub net_poll_interval_ms: u64,
pub max_events: usize,
pub max_scan_bytes: u64,
pub debounce_ms: u64,
}
impl Default for MonitoringConfig {
fn default() -> Self {
Self {
poll_interval_ms: 250,
net_poll_interval_ms: 500,
max_events: 50_000,
max_scan_bytes: 512 * 1024,
debounce_ms: 300,
}
}
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct SessionConfig {
pub auto_save: bool,
pub session_dir: String,
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct NotificationsConfig {
pub enabled: bool,
}
pub fn load_config() -> Config {
let config_path = sandspy_dir().join("config.toml");
if config_path.exists() {
if let Ok(content) = std::fs::read_to_string(&config_path) {
if let Ok(config) = toml::from_str::<Config>(&content) {
tracing::info!(path = %config_path.display(), "config loaded");
return config;
}
tracing::warn!(
"malformed config.toml at {}, using defaults",
config_path.display()
);
} else {
tracing::warn!(
"cannot read config.toml at {}, using defaults",
config_path.display()
);
}
}
Config::default()
}
pub fn sandspy_dir() -> PathBuf {
dirs::home_dir()
.unwrap_or_else(|| PathBuf::from("."))
.join(".sandspy")
}
pub fn sessions_dir() -> PathBuf {
sandspy_dir().join("sessions")
}
pub fn shared() -> Arc<Config> {
Arc::new(load_config())
}