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}