waxpkg 0.15.9

Fast Homebrew-compatible package manager
use crate::error::validate_package_name;
use crate::error::{Result, WaxError};
use crate::install::InstallState;
use console::style;

pub async fn pin(packages: &[String]) -> Result<()> {
    if packages.is_empty() {
        return Err(WaxError::InvalidInput("No packages specified".to_string()));
    }

    let state = InstallState::new()?;
    state.sync_from_cellar().await.ok();
    let installed = state.load().await?;

    for name in packages {
        validate_package_name(name)?;
        if !installed.contains_key(name.as_str()) {
            eprintln!(
                "{}: {} is not installed",
                style("warning").yellow(),
                style(name).magenta()
            );
            continue;
        }
        state.set_pinned(name, true).await?;
        let version = installed
            .get(name.as_str())
            .map(|p| p.version.as_str())
            .unwrap_or("?");
        println!(
            "{} {}@{} pinned",
            style("").green(),
            style(name).magenta(),
            style(version).dim()
        );
    }

    Ok(())
}

pub async fn unpin(packages: &[String]) -> Result<()> {
    if packages.is_empty() {
        return Err(WaxError::InvalidInput("No packages specified".to_string()));
    }

    let state = InstallState::new()?;
    state.sync_from_cellar().await.ok();
    let installed = state.load().await?;

    for name in packages {
        validate_package_name(name)?;
        if !installed.contains_key(name.as_str()) {
            eprintln!(
                "{}: {} is not installed",
                style("warning").yellow(),
                style(name).magenta()
            );
            continue;
        }
        state.set_pinned(name, false).await?;
        println!("{} {} unpinned", style("").green(), style(name).magenta());
    }

    Ok(())
}