use clap::{Parser, Subcommand}; use colored::*; use anyhow::Result; mod commands; mod sdk; mod project; mod templates; #[derive(Parser)] #[command(name = "weevil")] #[command(author = "Eric Barch ")] #[command(version = "1.0.0")] #[command(about = "FTC robotics project generator - bores into complexity, emerges with clean code", long_about = None)] struct Cli { #[command(subcommand)] command: Commands, } #[derive(Subcommand)] enum Commands { /// Create a new FTC robot project New { /// Name of the robot project name: String, /// Path to FTC SDK (optional, will auto-detect or download) #[arg(long)] ftc_sdk: Option, /// Path to Android SDK (optional, will auto-detect or download) #[arg(long)] android_sdk: Option, }, /// Upgrade an existing project to the latest generator version Upgrade { /// Path to the project directory path: String, }, /// Build and deploy project to Control Hub Deploy { /// Path to the project directory path: String, /// Force USB connection #[arg(long)] usb: bool, /// Force WiFi connection #[arg(long)] wifi: bool, /// Custom IP address #[arg(short, long)] ip: Option, }, /// Manage SDKs (FTC and Android) Sdk { #[command(subcommand)] command: SdkCommands, }, /// Show or update project configuration Config { /// Path to the project directory path: String, /// Set FTC SDK path for this project #[arg(long, value_name = "PATH")] set_sdk: Option, }, } #[derive(Subcommand)] enum SdkCommands { /// Install required SDKs Install, /// Show SDK status and locations Status, /// Update SDKs to latest versions Update, } fn main() -> Result<()> { // Enable colors on Windows #[cfg(windows)] colored::control::set_virtual_terminal(true).ok(); let cli = Cli::parse(); print_banner(); match cli.command { Commands::New { name, ftc_sdk, android_sdk } => { commands::new::create_project(&name, ftc_sdk.as_deref(), android_sdk.as_deref()) } Commands::Upgrade { path } => { commands::upgrade::upgrade_project(&path) } Commands::Deploy { path, usb, wifi, ip } => { commands::deploy::deploy_project(&path, usb, wifi, ip.as_deref()) } Commands::Sdk { command } => { match command { SdkCommands::Install => commands::sdk::install_sdks(), SdkCommands::Status => commands::sdk::show_status(), SdkCommands::Update => commands::sdk::update_sdks(), } } Commands::Config { path, set_sdk } => { if let Some(sdk_path) = set_sdk { commands::config::set_sdk(&path, &sdk_path) } else { commands::config::show_config(&path) } } } } fn print_banner() { println!("{}", "═══════════════════════════════════════════════════════════".bright_cyan()); println!("{}", " 🪲 Weevil - FTC Project Generator v1.0.0".bright_cyan().bold()); println!("{}", " Nexus Workshops LLC".bright_cyan()); println!("{}", "═══════════════════════════════════════════════════════════".bright_cyan()); println!(); }