diff --git a/src/lib.rs b/src/lib.rs index a1d586ac..a05c0a6a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -151,6 +151,10 @@ pub struct Metadata { pub packages: Vec, /// A list of all workspace members pub workspace_members: Vec, + /// A list of all workspace members + /// + /// This is always `None` if running with a version of Cargo older than 1.71. + pub workspace_default_members: Option>, /// Dependencies graph pub resolve: Option, /// Workspace root @@ -190,6 +194,20 @@ impl Metadata { .filter(|&p| self.workspace_members.contains(&p.id)) .collect() } + + /// Get the workspace default packages. + /// + /// This will always return `None` if running with a version of Cargo older than 1.71. + pub fn workspace_default_packages(&self) -> Option> { + self.workspace_default_members + .as_ref() + .map(|workspace_default_members| { + self.packages + .iter() + .filter(|&p| workspace_default_members.contains(&p.id)) + .collect() + }) + } } impl<'a> std::ops::Index<&'a PackageId> for Metadata { diff --git a/tests/selftest.rs b/tests/selftest.rs index d6ab6183..ab80e437 100644 --- a/tests/selftest.rs +++ b/tests/selftest.rs @@ -135,6 +135,9 @@ fn metadata_deps() { let workspace_packages = metadata.workspace_packages(); assert_eq!(workspace_packages.len(), 1); assert_eq!(&workspace_packages[0].id, this_id); + if let Some(default_packages) = metadata.workspace_default_packages() { + assert_eq!(default_packages, workspace_packages); + } let lib = this .targets diff --git a/tests/test_samples.rs b/tests/test_samples.rs index 15128b07..1f45d548 100644 --- a/tests/test_samples.rs +++ b/tests/test_samples.rs @@ -178,6 +178,7 @@ fn all_the_fields() { // path added in 1.51 // default_run added in 1.55 // rust_version added in 1.58 + // workspace_default_members added in 1.71 eprintln!("Skipping all_the_fields test, cargo {} is too old.", ver); return; } @@ -196,6 +197,11 @@ fn all_the_fields() { ); assert_eq!(meta.workspace_members.len(), 1); assert!(meta.workspace_members[0].to_string().starts_with("all")); + if ver >= semver::Version::parse("1.71.0").unwrap() { + assert_eq!(meta.workspace_default_members, Some(meta.workspace_members)); + } else { + assert_eq!(meta.workspace_default_members, None); + } assert_eq!(meta.packages.len(), 9); let all = meta.packages.iter().find(|p| p.name == "all").unwrap();