Add binary to list features

This commit is contained in:
Louis Dureuil 2024-01-09 13:24:33 +01:00
parent 84f49d76cd
commit 4b4e8ea2a4
No known key found for this signature in database
3 changed files with 57 additions and 0 deletions

View File

@ -16,6 +16,7 @@ members = [
"json-depth-checker",
"benchmarks",
"fuzzers",
"xtask",
]
[workspace.package]

15
xtask/Cargo.toml Normal file
View File

@ -0,0 +1,15 @@
[package]
name = "xtask"
version.workspace = true
authors.workspace = true
description.workspace = true
homepage.workspace = true
readme.workspace = true
edition.workspace = true
license.workspace = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
cargo_metadata = "0.18.1"
clap = { version = "4.4.14", features = ["derive"] }

41
xtask/src/main.rs Normal file
View File

@ -0,0 +1,41 @@
use std::collections::HashSet;
use clap::Parser;
/// List features available in the workspace
#[derive(Parser, Debug)]
struct ListFeaturesDeriveArgs {
/// Feature to exclude from the list. Repeat the argument to exclude multiple features
#[arg(short, long)]
exclude_feature: Vec<String>,
}
/// Utilitary commands
#[derive(Parser, Debug)]
#[command(author, version, about, long_about)]
#[command(name = "cargo xtask")]
#[command(bin_name = "cargo xtask")]
enum Command {
ListFeatures(ListFeaturesDeriveArgs),
}
fn main() {
let args = Command::parse();
match args {
Command::ListFeatures(args) => list_features(args),
}
}
fn list_features(args: ListFeaturesDeriveArgs) {
let exclude_features: HashSet<_> = args.exclude_feature.into_iter().collect();
let metadata = cargo_metadata::MetadataCommand::new().no_deps().exec().unwrap();
let features: Vec<String> = metadata
.packages
.iter()
.flat_map(|package| package.features.keys())
.filter(|feature| !exclude_features.contains(feature.as_str()))
.map(|s| s.to_owned())
.collect();
let features = features.join(" ");
println!("{features}")
}