Skip to main content

zoi_cli/cmd/
utils.rs

1use crate::pkg::{local, resolve};
2use anyhow::Result;
3
4pub fn expand_split_packages(package_names: &[String], action: &str) -> Result<Vec<String>> {
5    let mut expanded_names = Vec::new();
6    let installed_packages = local::get_installed_packages()?;
7
8    for name in package_names {
9        let request = resolve::parse_source_string(name)?;
10        let mut was_expanded = false;
11
12        if request.sub_package.is_none()
13            && let Ok((pkg, _, _, _, _, _, _)) =
14                resolve::resolve_package_and_version(name, None, true, false)
15            && pkg.sub_packages.is_some()
16        {
17            let mut installed_subs = Vec::new();
18            for manifest in &installed_packages {
19                if manifest.name == pkg.name
20                    && let Some(sub) = &manifest.sub_package
21                {
22                    installed_subs.push(sub.clone());
23                }
24            }
25
26            if !installed_subs.is_empty() {
27                println!(
28                    "'{}' is a split package. {} all installed sub-packages: {}",
29                    name,
30                    action,
31                    installed_subs.join(", ")
32                );
33                for sub in installed_subs {
34                    expanded_names.push(format!("{}:{}", name, sub));
35                }
36                was_expanded = true;
37            }
38        }
39
40        if !was_expanded {
41            expanded_names.push(name.clone());
42        }
43    }
44
45    Ok(expanded_names)
46}