zoi-cli 1.25.3

Advanced Package Manager & Environment Orchestrator
Documentation
//! Utility functions for CLI commands.

use anyhow::Result;

use crate::pkg::{local, resolve};

/// Expands split packages into their individual sub-packages if they are
/// installed.
///
/// # Errors
///
/// Returns an error if:
/// - The list of installed packages cannot be retrieved.
/// - A package name cannot be parsed.
/// - A package cannot be resolved to a specific version.
pub fn expand_split_packages(
    package_names: &[String],
    action: &str
) -> Result<Vec<String>> {
    let mut expanded_names = Vec::new();
    let installed_packages = local::get_installed_packages()?;

    for name in package_names {
        let request = resolve::parse_source_string(name)?;
        let mut was_expanded = false;

        if request.sub_package.is_none()
            && let Ok((pkg, _, _, _, _, _, _)) =
                resolve::resolve_package_and_version(name, None, true, false)
            && pkg.sub_packages.is_some()
        {
            let mut installed_subs = Vec::new();
            for manifest in &installed_packages {
                if manifest.name == pkg.name
                    && let Some(sub) = &manifest.sub_package
                {
                    installed_subs.push(sub.clone());
                }
            }

            if !installed_subs.is_empty() {
                println!(
                    "'{}' is a split package. {} all installed sub-packages: \
                     {}",
                    name,
                    action,
                    installed_subs.join(", ")
                );
                for sub in installed_subs {
                    expanded_names.push(format!("{name}:{sub}"));
                }
                was_expanded = true;
            }
        }

        if !was_expanded {
            expanded_names.push(name.clone());
        }
    }

    Ok(expanded_names)
}