use super::super::alc_toml::{load_alc_toml_document, remove_package_entry, save_alc_toml};
use super::super::lockfile::{load_lockfile, lockfile_path, save_lockfile};
use super::super::project::resolve_project_root;
use super::super::AppService;
impl AppService {
pub async fn pkg_remove(
&self,
name: &str,
project_root: Option<String>,
version: Option<String>,
) -> Result<String, String> {
let root = resolve_project_root(project_root.as_deref()).ok_or_else(|| {
format!(
"alc.toml not found: cannot remove '{name}' without a project root. \
Provide project_root or run from a project directory."
)
})?;
match load_alc_toml_document(&root)? {
Some(mut doc) => {
remove_package_entry(&mut doc, name);
save_alc_toml(&root, &doc)?;
}
None => {
return Err(format!("alc.toml not found at {}", root.display()));
}
}
let alc_lock_path = lockfile_path(&root);
match load_lockfile(&root)? {
Some(mut lock) => {
let before = lock.packages.len();
lock.packages.retain(|p| {
if p.name != name {
return true; }
match &version {
Some(v) => p.version.as_deref() != Some(v.as_str()),
None => false, }
});
if lock.packages.len() == before {
return Err(format!(
"Package '{name}' not found in alc.lock at {}",
alc_lock_path.display()
));
}
save_lockfile(&root, &lock)?;
}
None => {
return Err(format!(
"Package '{name}' not found in alc.lock at {}",
alc_lock_path.display()
));
}
}
Ok(serde_json::json!({
"removed": name,
"alc_toml": root.join("alc.toml").display().to_string(),
"alc_lock": alc_lock_path.display().to_string(),
})
.to_string())
}
}