use rustc_hash::FxHashSet;
use crate::config::{
RetentionDays as ConfigRetention, SearchQueryMode as ConfigSearchMode, StatsConfig,
StatsLevel as ConfigLevel,
};
use mineral_stats::{Level, Retention, SearchQueryMode, StatsParams};
pub fn params_from_config(cfg: &StatsConfig) -> StatsParams {
let level = match cfg.level() {
ConfigLevel::Off => Level::Off,
ConfigLevel::Core => Level::Core,
ConfigLevel::Full => Level::Full,
};
let search_queries = match cfg.search_queries() {
ConfigSearchMode::Raw => SearchQueryMode::Raw,
ConfigSearchMode::Hashed => SearchQueryMode::Hashed,
ConfigSearchMode::Off => SearchQueryMode::Off,
};
let retention = match cfg.retention_days() {
ConfigRetention::Forever => Retention::Forever,
ConfigRetention::Days(days) => Retention::Days(*days),
};
let gap_ms = i64::try_from(*cfg.session_gap_minutes())
.map(|m| m.saturating_mul(60_000))
.unwrap_or(i64::MAX);
let exclude_sources = cfg
.exclude_sources()
.iter()
.cloned()
.collect::<FxHashSet<String>>();
for kind in cfg.collect().keys() {
if !mineral_stats::is_event_kind(kind) {
mineral_log::warn!(target: "stats", kind = kind.as_str(), "stats.collect 含未知事件 kind 名,该键无效");
}
}
StatsParams::builder()
.level(level)
.collect(cfg.collect().clone())
.search_queries(search_queries)
.exclude_sources(exclude_sources)
.gap_ms(gap_ms)
.retention(retention)
.build()
}
#[cfg(test)]
mod tests {
use super::params_from_config;
use mineral_stats::{Level, Retention, SearchQueryMode};
#[test]
fn folds_default_config() -> color_eyre::Result<()> {
let config = crate::config::DaemonConfig::defaults()?;
let params = params_from_config(config.stats());
assert_eq!(params.level(), Level::Full);
assert_eq!(params.search_queries(), SearchQueryMode::Raw);
assert_eq!(params.retention(), Retention::Forever);
assert_eq!(params.gap_ms(), 30 * 60_000);
assert!(params.records_plays());
assert!(params.collects_event("searches"), "full 档默认采集事件");
assert!(!params.excludes_source("netease"));
Ok(())
}
}