mod args {
use argh::FromArgs;
#[derive(Debug, FromArgs)]
#[argh(name = "cargo")]
pub struct Args {
#[argh(subcommand)]
pub cmd: Subcommands,
}
#[derive(Debug, FromArgs)]
#[argh(subcommand)]
pub enum Subcommands {
Diet(Diet),
}
#[derive(Debug, FromArgs)]
#[argh(subcommand, name = "diet")]
pub struct Diet {
#[argh(switch, short = 'v')]
pub version: bool,
#[argh(switch, short = 'q')]
pub quiet: bool,
#[argh(switch, short = 'r')]
pub reset_manifest: bool,
#[argh(switch, short = 'n')]
pub dry_run: bool,
#[argh(option, short = 'l')]
pub list: Option<usize>,
#[argh(option, from_str_fn(parse_size))]
pub package_size_limit: Option<u64>,
#[argh(option)]
#[cfg(feature = "dev-support")]
pub save_package_for_unit_test: Option<std::path::PathBuf>,
}
fn parse_size(src: &str) -> Result<u64, String> {
byte_unit::Byte::parse_str(src, true)
.map_err(|err| err.to_string())
.and_then(|b| {
if b.as_u128() > u64::MAX as u128 {
Err("Value is too large".into())
} else {
Ok(b.as_u64())
}
})
}
}
use args::{Args, Diet, Subcommands};
fn main() -> anyhow::Result<()> {
let cmd = argh::from_env::<Args>().cmd;
let Subcommands::Diet(Diet {
version,
quiet,
reset_manifest: reset,
dry_run,
list,
package_size_limit,
#[cfg(feature = "dev-support")]
save_package_for_unit_test,
}) = cmd;
if version {
println!(env!("CARGO_PKG_VERSION"));
return Ok(());
}
let output: &mut dyn std::io::Write = if quiet {
&mut std::io::sink()
} else {
&mut std::io::stdout().lock()
};
cargo_diet::execute(
cargo_diet::Options {
reset,
dry_run,
colored_output: atty::is(atty::Stream::Stdout),
list,
package_size_limit,
#[cfg(feature = "dev-support")]
save_package_for_unit_test,
},
output,
)?;
Ok(())
}