use super::{CompactSink, ScanDiagnostics, scan_cached_files};
use crate::config::ProvidersConfig;
use crate::constants::FastHashSet;
use crate::models::ExtensionType;
use crate::models::TimeRange;
use crate::pricing::TierThresholds;
use crate::summary_cache::{SummaryCacheKey, SummaryScanCache};
use crate::utils::{
COPILOT_SESSION_MAX_DEPTH, GROK_SESSION_MAX_DEPTH, HelperPaths, is_claude_session_file,
is_codex_session_file, is_copilot_session_file, is_gemini_session_file, is_grok_session_file,
};
use anyhow::Result;
use std::path::Path;
struct FileProviderSpec {
provider: ExtensionType,
enabled: fn(&ProvidersConfig) -> bool,
dirs: fn(&HelperPaths) -> Vec<&Path>,
filter: fn(&Path) -> bool,
max_depth: Option<usize>,
}
const FILE_PROVIDERS: [FileProviderSpec; 5] = [
FileProviderSpec {
provider: ExtensionType::ClaudeCode,
enabled: |p| p.claude,
dirs: |p| vec![p.claude_session_dir.as_path()],
filter: is_claude_session_file,
max_depth: None,
},
FileProviderSpec {
provider: ExtensionType::Codex,
enabled: |p| p.codex,
dirs: |p| p.codex_session_dirs().to_vec(),
filter: is_codex_session_file,
max_depth: None,
},
FileProviderSpec {
provider: ExtensionType::Copilot,
enabled: |p| p.copilot,
dirs: |p| vec![p.copilot_session_dir.as_path()],
filter: is_copilot_session_file,
max_depth: Some(COPILOT_SESSION_MAX_DEPTH),
},
FileProviderSpec {
provider: ExtensionType::Gemini,
enabled: |p| p.gemini,
dirs: |p| vec![p.gemini_session_dir.as_path()],
filter: is_gemini_session_file,
max_depth: None,
},
FileProviderSpec {
provider: ExtensionType::Grok,
enabled: |p| p.grok,
dirs: |p| vec![p.grok_session_dir.as_path()],
filter: is_grok_session_file,
max_depth: Some(GROK_SESSION_MAX_DEPTH),
},
];
#[allow(clippy::too_many_arguments)]
pub(crate) fn scan_all_cached_files(
paths: &HelperPaths,
providers: ProvidersConfig,
time_range: TimeRange,
cache: &mut SummaryScanCache,
seen: &mut FastHashSet<SummaryCacheKey>,
sink: &mut impl CompactSink,
diagnostics: &mut ScanDiagnostics,
tiers: Option<&TierThresholds>,
) -> Result<()> {
for spec in &FILE_PROVIDERS {
if (spec.enabled)(&providers) {
scan_cached_files(
&(spec.dirs)(paths),
spec.provider,
spec.filter,
time_range,
spec.max_depth,
cache,
seen,
sink,
diagnostics,
tiers,
)?;
}
}
Ok(())
}