//! Cargo flag for selecting the relevant crate. use std::path; #[derive(Default, Clone, Debug, PartialEq, Eq)] #[cfg_attr(feature = "clap", derive(clap::Args))] #[non_exhaustive] pub struct Manifest { #[cfg_attr(feature = "clap", arg(long, name = "PATH"))] /// Path to Cargo.toml pub manifest_path: Option, } #[cfg(feature = "cargo_metadata")] impl Manifest { /// Create a `cargo_metadata::MetadataCommand` /// /// Note: Requires the features `cargo_metadata`. pub fn metadata(&self) -> cargo_metadata::MetadataCommand { let mut c = cargo_metadata::MetadataCommand::new(); if let Some(ref manifest_path) = self.manifest_path { c.manifest_path(manifest_path); } c } } #[cfg(test)] mod test { use super::*; #[test] #[cfg(feature = "clap")] fn verify_app() { #[derive(Debug, clap::Parser)] struct Cli { #[command(flatten)] manifest: Manifest, } use clap::CommandFactory; Cli::command().debug_assert() } #[cfg(feature = "cargo_metadata")] #[test] fn metadata_with_path() { let manifest = Manifest { manifest_path: Some(path::PathBuf::from("tests/fixtures/simple/Cargo.toml")), }; let metadata = manifest.metadata(); metadata.exec().unwrap(); // TODO verify we forwarded correctly. } #[cfg(feature = "cargo_metadata")] #[test] fn metadata_without_path() { let cwd = path::PathBuf::from("tests/fixtures/simple"); let manifest = Manifest { manifest_path: None, }; let mut metadata = manifest.metadata(); metadata.current_dir(cwd).exec().unwrap(); // TODO verify we forwarded correctly. } }