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}