aico/commands/
drop.rs

1use crate::exceptions::AicoError;
2use crate::fs::validate_input_paths;
3use crate::session::Session;
4use std::path::PathBuf;
5
6pub fn run(file_paths: Vec<PathBuf>) -> Result<(), AicoError> {
7    let mut session = Session::load_active()?;
8
9    // 1. Validate (require_exists = false)
10    // Note: Python drop checks validity but allows files missing from disk to be dropped from context
11    let (valid_rels, has_errors) = validate_input_paths(&session.root, &file_paths, false);
12
13    // 2. Modify View
14    let mut changed = false;
15
16    // We track explicit errors for files not in context
17    let mut context_errors = false;
18
19    for rel in valid_rels {
20        if let Some(pos) = session.view.context_files.iter().position(|x| x == &rel) {
21            session.view.context_files.remove(pos);
22            println!("Dropped file from context: {}", rel);
23            changed = true;
24        } else {
25            eprintln!("Error: File not in context: {}", rel);
26            context_errors = true;
27        }
28    }
29
30    // 3. Save
31    if changed {
32        session.save_view()?;
33    }
34
35    if has_errors || context_errors {
36        return Err(AicoError::InvalidInput(
37            "One or more files could not be dropped.".into(),
38        ));
39    }
40
41    Ok(())
42}