in guppy/src/graph/build.rs [79:134]
fn new(
workspace_root: impl Into<Utf8PathBuf>,
target_directory: impl Into<Utf8PathBuf>,
metadata_table: serde_json::Value,
packages: &HashMap<PackageId, PackageMetadataImpl>,
members: impl IntoIterator<Item = PackageId>,
) -> Result<Self, Error> {
use std::collections::btree_map::Entry;
let workspace_root = workspace_root.into();
// Build up the workspace members by path, since most interesting queries are going to
// happen by path.
let mut members_by_path = BTreeMap::new();
let mut members_by_name = BTreeMap::new();
for id in members {
// Strip off the workspace path from the manifest path.
let package_metadata = packages.get(&id).ok_or_else(|| {
Error::PackageGraphConstructError(format!("workspace member '{}' not found", id))
})?;
let workspace_path = match &package_metadata.source {
PackageSourceImpl::Workspace(path) => path,
_ => {
return Err(Error::PackageGraphConstructError(format!(
"workspace member '{}' at path {:?} not in workspace",
id, package_metadata.manifest_path,
)));
}
};
members_by_path.insert(workspace_path.to_path_buf(), id.clone());
match members_by_name.entry(package_metadata.name.clone().into_boxed_str()) {
Entry::Vacant(vacant) => {
vacant.insert(id.clone());
}
Entry::Occupied(occupied) => {
return Err(Error::PackageGraphConstructError(format!(
"duplicate package name in workspace: '{}' is name for '{}' and '{}'",
occupied.key(),
occupied.get(),
id
)))
}
}
}
Ok(Self {
root: workspace_root,
target_directory: target_directory.into(),
metadata_table,
members_by_path,
members_by_name,
#[cfg(feature = "proptest1")]
name_list: OnceCell::new(),
})
}