use super::{CratesArgs, DepsArgs, InitArgs, ValidateArgs, init_config, process_crates, process_dependencies, validate_config};
use crate::{Host, Result};
use clap::builder::Styles;
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)]
#[command(about = "Appraise the quality of Rust dependencies")]
#[command(styles = CLAP_STYLES)]
struct Cli {
#[command(subcommand)]
command: CargoSubcommand,
}
#[derive(Subcommand, Debug)]
enum CargoSubcommand {
Aprz(Args),
}
#[derive(Parser, Debug)]
#[command(author, version, long_about = None)]
#[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) -> Result<()>
where
I: IntoIterator<Item = T>,
T: Into<std::ffi::OsString> + Clone,
H: Host,
{
let CargoSubcommand::Aprz(args) = Cli::parse_from(args).command;
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),
}
}