use std::path::Path;
use anyhow::{Context, Result};
use cargo_metadata::{Metadata, MetadataCommand, Package};
use tokio::task::spawn_blocking;
#[derive(Clone, Debug)]
pub struct CargoMetadata {
pub metadata: Metadata,
pub package: Package,
pub manifest_path: String,
}
impl CargoMetadata {
pub async fn new(manifest: &Path) -> Result<Self> {
let mut cmd = MetadataCommand::new();
cmd.manifest_path(dunce::simplified(manifest));
let metadata = spawn_blocking(move || cmd.exec())
.await
.context("error awaiting spawned cargo metadata task")?
.context("error getting cargo metadata")?;
Self::from_metadata(metadata)
}
pub(crate) fn from_metadata(metadata: Metadata) -> Result<Self> {
let package = metadata
.root_package()
.cloned()
.context("could not find the root package of the target crate")?;
let manifest_path = package.manifest_path.to_string();
Ok(Self {
metadata,
package,
manifest_path,
})
}
}