use crate::common::{OutputFormat, Registry, WorkspacePath};
use clap::{ArgAction, Args, Subcommand};
#[derive(Args)]
pub struct ListArgs {
#[command(subcommand)]
command: ListCommand,
}
#[derive(Subcommand)]
pub enum ListCommand {
Gears(GearsArgs),
Templates(TemplatesArgs),
Features(FeaturesArgs),
Deps(DepsArgs),
Packages(PackagesArgs),
Targets(TargetsArgs),
}
#[derive(Args)]
pub struct TargetsArgs {
#[arg(long)]
manifest: std::path::PathBuf,
#[arg(short = 'f', long, value_enum, default_value_t = OutputFormat::List)]
format: OutputFormat,
}
#[derive(Args)]
pub struct TemplatesArgs {
#[command(flatten)]
workspace: WorkspacePath,
}
#[derive(Args)]
pub struct GearsArgs {
#[command(flatten)]
workspace: WorkspacePath,
#[arg(short = 'v', long)]
verbose: bool,
#[arg(long, action = ArgAction::SetTrue)]
system: bool,
#[arg(long, action = ArgAction::SetTrue)]
local: bool,
#[arg(long, value_enum, default_value_t = Registry::CratesIo)]
registry: Registry,
#[arg(short = 'f', long, value_enum, default_value_t = OutputFormat::Json)]
format: OutputFormat,
#[arg(long)]
filter: Option<String>,
#[arg(long, value_delimiter = ',')]
dirs: Vec<String>,
#[arg(long)]
include_rdeps: bool,
}
impl ListArgs {
pub fn run(self) -> anyhow::Result<()> {
cargo_gears_core::list::ListParams::from(self).run()
}
}
impl From<ListArgs> for cargo_gears_core::list::ListParams {
fn from(args: ListArgs) -> Self {
Self {
command: args.command.into(),
}
}
}
#[derive(Args)]
pub struct FeaturesArgs {
#[arg(long)]
manifest: std::path::PathBuf,
#[arg(short = 'f', long, value_enum, default_value_t = OutputFormat::List)]
format: OutputFormat,
}
#[derive(Args)]
pub struct DepsArgs {
#[arg(long)]
manifest: std::path::PathBuf,
#[arg(long)]
non_optional: bool,
#[arg(long)]
dev: bool,
#[arg(long)]
build: bool,
#[arg(short = 'f', long, value_enum, default_value_t = OutputFormat::List)]
format: OutputFormat,
}
#[derive(Args)]
pub struct PackagesArgs {
#[command(flatten)]
workspace: WorkspacePath,
#[arg(long, value_delimiter = ',')]
dirs: Vec<String>,
#[arg(long)]
filter: Option<String>,
#[arg(long)]
include_rdeps: bool,
#[arg(short = 'f', long, value_enum, default_value_t = OutputFormat::List)]
format: OutputFormat,
}
impl From<ListCommand> for cargo_gears_core::list::ListCommand {
fn from(command: ListCommand) -> Self {
match command {
ListCommand::Gears(args) => Self::Gears(args.into()),
ListCommand::Templates(args) => Self::Templates(args.into()),
ListCommand::Features(args) => Self::Features(args.into()),
ListCommand::Deps(args) => Self::Deps(args.into()),
ListCommand::Packages(args) => Self::Packages(args.into()),
ListCommand::Targets(args) => Self::Targets(args.into()),
}
}
}
impl From<TargetsArgs> for cargo_gears_core::list::TargetsParams {
fn from(args: TargetsArgs) -> Self {
Self {
manifest: args.manifest,
format: args.format,
}
}
}
impl From<PackagesArgs> for cargo_gears_core::list::PackagesParams {
fn from(args: PackagesArgs) -> Self {
Self {
path: args.workspace.path,
dirs: args.dirs,
filter: args.filter,
include_rdeps: args.include_rdeps,
format: args.format,
}
}
}
impl From<FeaturesArgs> for cargo_gears_core::list::FeaturesParams {
fn from(args: FeaturesArgs) -> Self {
Self {
manifest: args.manifest,
format: args.format,
}
}
}
impl From<DepsArgs> for cargo_gears_core::list::DepsParams {
fn from(args: DepsArgs) -> Self {
Self {
manifest: args.manifest,
non_optional: args.non_optional,
dev: args.dev,
build: args.build,
format: args.format,
}
}
}
impl From<TemplatesArgs> for cargo_gears_core::list::TemplatesParams {
fn from(args: TemplatesArgs) -> Self {
Self {
path: args.workspace.path,
}
}
}
impl From<GearsArgs> for cargo_gears_core::list::GearsParams {
fn from(args: GearsArgs) -> Self {
let output = if args.system || args.local {
match (args.system, args.local) {
(true, false) => cargo_gears_core::list::GearsOutput::system(),
(false, true) => cargo_gears_core::list::GearsOutput::local(),
_ => cargo_gears_core::list::GearsOutput::all(),
}
} else {
cargo_gears_core::list::GearsOutput::all()
};
Self {
path: args.workspace.path,
verbose: args.verbose,
output,
registry: args.registry,
format: args.format,
filter: args.filter,
dirs: args.dirs,
include_rdeps: args.include_rdeps,
}
}
}