use crate::Cli; use anyhow::Result; use std::path::PathBuf; pub struct Config { pub roots: Vec, 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, 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 { 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, }) } }