use clap::{Parser, Subcommand};
mod new;
mod setup;
#[derive(Parser)]
#[command(name = "autumn", version, about = "The Autumn web framework CLI")]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
New {
name: String,
},
Setup {
#[arg(long)]
force: bool,
},
}
fn main() {
let cli = Cli::parse();
match cli.command {
Commands::New { name } => new::run(&name),
Commands::Setup { force } => setup::run(force),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_new_subcommand() {
let cli = Cli::try_parse_from(["autumn", "new", "my-app"]).unwrap();
match cli.command {
Commands::New { ref name } => assert_eq!(name, "my-app"),
Commands::Setup { .. } => panic!("expected New command"),
}
}
#[test]
fn parse_new_with_underscores() {
let cli = Cli::try_parse_from(["autumn", "new", "my_app"]).unwrap();
match cli.command {
Commands::New { ref name } => assert_eq!(name, "my_app"),
Commands::Setup { .. } => panic!("expected New command"),
}
}
#[test]
fn parse_setup_subcommand() {
let cli = Cli::try_parse_from(["autumn", "setup"]).unwrap();
assert!(matches!(cli.command, Commands::Setup { force: false }));
}
#[test]
fn parse_setup_with_force() {
let cli = Cli::try_parse_from(["autumn", "setup", "--force"]).unwrap();
assert!(matches!(cli.command, Commands::Setup { force: true }));
}
#[test]
fn no_args_is_error() {
assert!(Cli::try_parse_from(["autumn"]).is_err());
}
#[test]
fn new_missing_name_is_error() {
assert!(Cli::try_parse_from(["autumn", "new"]).is_err());
}
#[test]
fn unknown_subcommand_is_error() {
assert!(Cli::try_parse_from(["autumn", "bogus"]).is_err());
}
}