mod build;
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")]
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),
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::Run(run) => run.resolve_and_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::Tools(tools) => Ok(Self::Tools(tools.into())),
Commands::Deploy(deploy) => Ok(Self::Deploy(deploy.into())),
Commands::Lint(_) | Commands::Test(_) | Commands::Build(_) | Commands::Run(_) => {
anyhow::bail!("manifest-based commands should be resolved 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)
}
}