use crate::{config::Config, package::Packages, package_manager::PackageManager, repo::Repo};
use anyhow::Result;
use colored::Colorize;
use dialoguer::Confirm;
pub fn catch(line: &str) -> Result<()> {
if !PackageManager::detects_line(line) {
return Ok(());
}
let mut catches = Packages::from_line(line);
if catches.is_empty() {
return Ok(());
}
let config = Config::from_default_file_or_new()?;
let repo = Repo::new(config, false)?;
catches.filter_saved_packages(&repo.read()?);
if catches.is_empty() {
return Ok(());
}
repo.pull()?;
catches.filter_saved_packages(&repo.read()?);
let len = catches.len();
if len == 0 {
return Ok(());
}
match len {
1 => println!("{}", "Mirror this command?".green().bold()),
n => println!("{}", format!("Mirror these {} commands?", n).green().bold()),
}
for catch in catches.iter() {
println!("- {}", catch.color_full_name());
}
if !Confirm::new().interact()? {
return Ok(());
}
repo.mirror(catches)?;
Ok(())
}