mod build;
mod clean;
mod common;
mod config;
mod deploy;
mod generate;
mod help;
mod lint;
mod list;
mod manifest;
mod run;
mod source;
mod testing;
mod tools;
use std::convert::TryFrom;
#[derive(clap::Parser)]
#[command(version, about)]
#[command(propagate_version = true)]
#[command(name = "gears")]
#[command(arg_required_else_help = true)]
pub struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(clap::Subcommand)]
#[command(disable_help_subcommand = true)]
enum Commands {
Generate(generate::GenerateArgs),
New(generate::WorkspaceArgs),
Config(Box<config::ConfigArgs>),
Src(source::SourceArgs),
Help(help::HelpArgs),
Lint(lint::LintArgs),
#[command(name = "ls")]
List(list::ListArgs),
Manifest(manifest::ManifestArgs),
Test(testing::TestArgs),
Tools(tools::ToolsArgs),
Run(run::RunArgs),
Build(build::BuildArgs),
Clean(clean::CleanArgs),
Deploy(deploy::DeployArgs),
}
impl Cli {
pub fn run(self) -> anyhow::Result<()> {
match self.command {
Commands::Lint(lint) => lint.resolve()?.run(),
Commands::Test(test) => test.resolve()?.run(),
Commands::Build(build) => build.resolve()?.run(),
Commands::Clean(clean) => clean.resolve()?.run(),
Commands::Deploy(deploy) => deploy.resolve()?.run(),
Commands::Run(run) => run.resolve_and_run(),
Commands::Tools(tools) => tools.run(),
other => cargo_gears_core::GearsCommand::try_from(other)?.run(),
}
}
}
impl TryFrom<Commands> for cargo_gears_core::GearsCommand {
type Error = anyhow::Error;
fn try_from(cmd: Commands) -> Result<Self, Self::Error> {
match cmd {
Commands::Generate(generate) => Ok(Self::Generate(generate.into())),
Commands::New(workspace) => {
Ok(Self::Generate(cargo_gears_core::generate::GenerateParams {
command: cargo_gears_core::generate::GenerateCommand::Workspace(
workspace.into(),
),
}))
}
Commands::Config(config) => Ok(Self::Config((*config).into())),
Commands::Src(src) => Ok(Self::Src(src.into())),
Commands::Help(help) => Ok(help.into()),
Commands::List(list) => Ok(Self::List(list.into())),
Commands::Manifest(manifest) => Ok(Self::Manifest(manifest.into())),
Commands::Lint(_)
| Commands::Test(_)
| Commands::Build(_)
| Commands::Clean(_)
| Commands::Deploy(_)
| Commands::Run(_)
| Commands::Tools(_) => {
anyhow::bail!("command should be dispatched directly in Cli::run()")
}
}
}
}
impl TryFrom<Cli> for cargo_gears_core::GearsCommand {
type Error = anyhow::Error;
fn try_from(cli: Cli) -> Result<Self, Self::Error> {
Self::try_from(cli.command)
}
}