use std::path::Path;
use anyhow::{Context, Result};
use async_std::task::spawn_blocking;
use cargo_metadata::{Metadata, MetadataCommand, Package};
#[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 getting cargo metadata")?;
let package = metadata
.root_package()
.cloned()
.context("could not find root package of the target crate")?;
let manifest_path = package.manifest_path.to_string_lossy().to_string();
Ok(Self {
metadata,
package,
manifest_path,
})
}
}