use crate::Cli;
use anyhow::Result;
use std::path::PathBuf;
pub struct Config {
pub roots: Vec<PathBuf>,
pub out: PathBuf,
pub workdir: PathBuf,
pub model_url: String,
pub model: String,
pub max_file_bytes: u64,
pub max_files: usize,
#[allow(dead_code)]
pub concurrency: usize,
pub dry_run: bool,
pub resume: bool,
pub ocr: bool,
pub include_hidden: bool,
pub excludes: Vec<String>,
pub redact: bool,
pub extract_only: bool,
pub include_apps: bool,
pub include_code: bool,
pub no_llm: bool,
}
impl Config {
pub fn from_cli(cli: &Cli) -> Result<Self> {
let roots = if cli.root.is_empty() {
vec![dirs::home_dir().unwrap_or_else(|| PathBuf::from("."))]
} else {
cli.root.clone()
};
let mut excludes = vec![
".git".into(),
"node_modules".into(),
"__pycache__".into(),
".cache".into(),
"target".into(),
".venv".into(),
"venv".into(),
"dist".into(),
"build".into(),
".npm".into(),
".cargo".into(),
".rustup".into(),
"steam".into(),
"steamapps".into(),
".bitmonero".into(),
"Monero".into(),
];
excludes.extend(cli.exclude.clone());
Ok(Config {
roots,
out: cli.out.clone(),
workdir: cli.workdir.clone(),
model_url: cli.model_url.clone(),
model: cli.model.clone(),
max_file_bytes: cli.max_file_bytes,
max_files: cli.max_files,
concurrency: cli.concurrency.max(1),
dry_run: cli.dry_run,
resume: cli.resume,
ocr: cli.ocr,
include_hidden: cli.include_hidden,
excludes,
redact: !cli.no_redact,
extract_only: cli.extract_only,
include_apps: !cli.no_apps,
include_code: cli.include_code,
no_llm: cli.no_llm,
})
}
}