use clap::Parser;
use log::LevelFilter;
use crate::utils;
#[expect(
clippy::struct_excessive_bools,
reason = "This struct is used to parse CLI arguments"
)]
#[derive(Parser)]
#[command(author, version, about)]
pub struct Cli {
#[clap(short, long)]
pub(crate) list: bool,
#[clap(short = 'n', long)]
pub(crate) list_updates: bool,
#[clap(short, long)]
pub(crate) update: bool,
#[clap(short = 'f', long = "loglevel", default_value = "Info")]
pub(crate) filter: LevelFilter,
#[clap(short, long)]
pub(crate) init: bool,
}
impl Cli {
pub fn run(&self) -> anyhow::Result<()> {
utils::initialize_logger(self.filter)?;
if self.init {
utils::init()?;
} else if self.update {
let cargo_bins = utils::get_installed_bins()?;
let packages = utils::get_package_infos(&cargo_bins);
utils::version_occurrences(&packages);
log::debug!("Updating packages");
utils::update(&packages)?;
} else if self.list_updates || self.list {
let cargo_bins = utils::get_installed_bins()?;
let packages = utils::get_package_infos(&cargo_bins);
utils::list_pkgs(packages, self.list_updates);
} else {
println!("No action specified");
}
Ok(())
}
}