zoi/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, _, _, _, _)) = resolve::resolve_package_and_version(name, true)
14            && pkg.sub_packages.is_some()
15        {
16            let mut installed_subs = Vec::new();
17            for manifest in &installed_packages {
18                if manifest.name == pkg.name
19                    && let Some(sub) = &manifest.sub_package
20                {
21                    installed_subs.push(sub.clone());
22                }
23            }
24
25            if !installed_subs.is_empty() {
26                println!(
27                    "'{}' is a split package. {} all installed sub-packages: {}",
28                    name,
29                    action,
30                    installed_subs.join(", ")
31                );
32                for sub in installed_subs {
33                    expanded_names.push(format!("{}:{}", name, sub));
34                }
35                was_expanded = true;
36            }
37        }
38
39        if !was_expanded {
40            expanded_names.push(name.clone());
41        }
42    }
43
44    Ok(expanded_names)
45}