use super::{CratesArgs, DepsArgs, InitArgs, ValidateArgs, init_config, process_crates, process_dependencies, validate_config};
use crate::Host;
use clap::builder::Styles;
use std::io::Write;
use clap::builder::styling::{AnsiColor, Effects};
use clap::{Parser, Subcommand};
const CLAP_STYLES: Styles = Styles::styled()
.header(AnsiColor::Green.on_default().effects(Effects::BOLD))
.usage(AnsiColor::Green.on_default().effects(Effects::BOLD))
.literal(AnsiColor::Cyan.on_default().effects(Effects::BOLD))
.placeholder(AnsiColor::Cyan.on_default());
#[derive(Parser, Debug)]
#[command(name = "cargo-aprz", bin_name = "cargo", version, about, author)]
#[command(styles = CLAP_STYLES)]
struct Cli {
#[command(subcommand)]
command: CargoSubcommand,
}
#[derive(Subcommand, Debug)]
enum CargoSubcommand {
Aprz(Args),
}
#[derive(Parser, Debug)]
#[command(name = "cargo-aprz", author, version, long_about = None, display_name = "cargo-aprz")]
#[command(about = "Appraise the quality of Rust dependencies")]
struct Args {
#[command(subcommand)]
command: AprzSubcommand,
}
#[derive(Subcommand, Debug)]
enum AprzSubcommand {
Crates(Box<CratesArgs>),
Deps(Box<DepsArgs>),
Init(InitArgs),
Validate(ValidateArgs),
}
pub async fn run<I, T, H>(host: &mut H, args: I)
where
I: IntoIterator<Item = T>,
T: Into<std::ffi::OsString> + Clone,
H: Host,
{
let CargoSubcommand::Aprz(args) = Cli::parse_from(args).command;
let result = match &args.command {
AprzSubcommand::Crates(crates_args) => process_crates(host, crates_args).await,
AprzSubcommand::Deps(deps_args) => process_dependencies(host, deps_args).await,
AprzSubcommand::Init(init_args) => init_config(host, init_args),
AprzSubcommand::Validate(validate_args) => validate_config(host, validate_args),
};
if let Err(e) = result {
let _ = writeln!(host.error(), "ERROR: {e}");
host.exit(1);
}
}