cli_xtask/workspace/
metadata.rs

1use cargo_metadata::{camino::Utf8Path, Metadata, Package};
2
3use super::PackageExt;
4
5/// Extension methods for [`cargo_metadata::Metadata`].
6pub trait MetadataExt {
7    /// Returns the workspace package with given name.
8    fn workspace_package_by_name<'a>(&'a self, name: &str) -> Option<&'a Package>;
9
10    /// Returns the workspace package with given path.
11    ///
12    /// `path` must be absolute and normalized.
13    fn workspace_package_by_path(&'_ self, path: impl AsRef<Utf8Path>) -> Option<&'_ Package>;
14}
15
16impl MetadataExt for Metadata {
17    fn workspace_package_by_name<'a>(&'a self, name: &str) -> Option<&'a Package> {
18        self.workspace_packages()
19            .into_iter()
20            .find(|p| p.name == name)
21    }
22
23    fn workspace_package_by_path(&'_ self, path: impl AsRef<Utf8Path>) -> Option<&'_ Package> {
24        let path = path.as_ref();
25        assert!(path.is_absolute());
26        self.workspace_packages()
27            .into_iter()
28            .filter(|package| path.starts_with(package.root_directory()))
29            .max_by_key(|p| p.manifest_path.as_str().len())
30    }
31}