hysp 0.1.2

📦 An independent package manager that every hacker deserves.
Documentation
use crate::engine::helpers::remove_and_print;
use crate::engine::{
    args::RemoveArgs,
    config::pkg_config_structure::PackageInfo,
    helpers::{
        local_config, print_package_info, prompt_yn, read_file_content, remove_trailing_slash,
    },
    msgx::info,
};
use anyhow::Result;

pub async fn remove_pkgs(pkg_remove_args: RemoveArgs) -> Result<()> {
    for package in pkg_remove_args.packages {
        remove_package(&package, pkg_remove_args.force, pkg_remove_args.quiet).await?;
    }
    Ok(())
}

pub async fn remove_package(package_name: &str, force: bool, quiet: bool) -> Result<()> {
    let (_hysp_remote, hysp_data_dir, hysp_bin_dir, _hysp_metadata, _architecture) =
        match local_config().await {
            Ok((remote, data_dir, bin_dir, metadata, architecture)) => {
                (remote, data_dir, bin_dir, metadata, architecture)
            }
            Err(err) => {
                eprintln!("{}", err);
                std::process::exit(1);
            }
        };

    let package_toml_path = format!(
        "{}/{}.toml",
        remove_trailing_slash(hysp_data_dir.clone()),
        package_name
    );

    let package_toml = read_file_content(&package_toml_path).await;
    match package_toml {
        Ok(package_toml) => {
            let parsed_package_info: PackageInfo = toml::from_str(&package_toml)?;

            if !quiet {
                print_package_info(parsed_package_info.clone());
            }

            let package_binary_name = parsed_package_info.bin.name;
            let package_binary_path = format!(
                "{}/{}",
                remove_trailing_slash(hysp_bin_dir.clone()),
                package_binary_name
            );

            if !force {
                info(
                    &format!("Removing package : {} ", package_binary_name),
                    colored::Color::Cyan,
                );
                if !prompt_yn("Would you like to proceed with the transaction (y/n)? ".to_string())
                {
                    return Ok(());
                }
            }

            let dependencies: Vec<String> = parsed_package_info.package.conditions.requires;
            let dependencies_str: String = dependencies.join(", ");

            if !dependencies.is_empty() {
                info(
                    &format!("Dependencies detected, removing : {} ", dependencies_str),
                    colored::Color::Cyan,
                );
            }

            for dependency in dependencies {
                let dependent_toml_path = format!(
                    "{}/{}.toml",
                    remove_trailing_slash(hysp_data_dir.clone()),
                    dependency
                );

                let dependent_package_toml = read_file_content(&dependent_toml_path).await?;

                let parsed_dependent_package_info: PackageInfo =
                    toml::from_str(&dependent_package_toml)?;

                let dependent_binary_path = format!(
                    "{}/{}",
                    remove_trailing_slash(hysp_bin_dir.clone()),
                    parsed_dependent_package_info.bin.name
                );
                remove_and_print(&dependent_binary_path);
                remove_and_print(&dependent_toml_path);
            }

            remove_and_print(&package_binary_path);
            remove_and_print(&package_toml_path);

            Ok(())
        }
        Err(_e) => {
            info(
                &format!("No such package found as : {} ", package_toml_path),
                colored::Color::Cyan,
            );
            Ok(())
        }
    }
}