zoi-cli 1.24.6

Advanced Package Manager & Environment Orchestrator
Documentation
use crate::pkg::{config, types};
use anyhow::{Result, anyhow};
use colored::*;
use std::collections::HashMap;

pub fn run(packages: Vec<String>, global: bool) -> Result<()> {
    if global {
        run_global(packages)
    } else {
        run_project(packages)
    }
}

fn run_global(packages: Vec<String>) -> Result<()> {
    println!(
        "{} Adding packages to global configuration...",
        "::".bold().blue()
    );

    let mut versions_to_add = HashMap::new();
    for pkg_spec in &packages {
        let request = crate::pkg::resolve::parse_source_string(pkg_spec)?;
        let version = request.version_spec.unwrap_or_else(|| "latest".to_string());
        versions_to_add.insert(request.name, version);
    }

    config::update_global_versions(versions_to_add)?;

    println!("{} Installing global packages...", "::".bold().blue());
    let options = crate::SourceInstallOptions {
        scope_override: Some(types::Scope::User),
        yes: true,
        ..Default::default()
    };

    crate::install_sources(&packages, &options)?;

    println!("\n{}", "Global packages updated and installed.".green());
    Ok(())
}

fn run_project(packages: Vec<String>) -> Result<()> {
    if !std::path::Path::new("zoi.lua").exists() {
        return Err(anyhow!(
            "No 'zoi.lua' found in the current directory. Run 'zoi use --global' or initialize a project first."
        ));
    }

    println!(
        "{} Project uses zoi.lua. Automatic saving is not supported for Lua configurations.",
        "Note:".yellow().bold()
    );
    println!("   Please add the following to your packages() block in zoi.lua:");
    for pkg in &packages {
        println!("   - \"{}\"", pkg);
    }

    println!("{} Installing project packages...", "::".bold().blue());
    let options = crate::SourceInstallOptions {
        scope_override: Some(types::Scope::Project),
        yes: true,
        ..Default::default()
    };

    crate::install_sources(&packages, &options)?;

    println!("\n{}", "Project packages updated and installed.".green());
    Ok(())
}