use clap::{Parser, Subcommand}; use colored::*; use std::path::PathBuf; mod template; mod generator; mod validator; #[derive(Parser)] #[command(name = "nac-init-web")] #[command(about = "NAC Web项目初始化工具", long_about = None)] struct Cli { #[command(subcommand)] command: Commands, } #[derive(Subcommand)] enum Commands { /// 创建新的Web项目 New { /// 项目名称 name: String, /// 模板类型 (react-default, react-ts, vue-default, wallet, exchange) #[arg(short, long, default_value = "react-default")] template: String, /// 输出目录 #[arg(short, long)] output: Option, }, /// 列出可用模板 List, /// 验证项目宪法合规性 Check { /// 项目路径 #[arg(default_value = ".")] path: PathBuf, }, } fn main() -> anyhow::Result<()> { let cli = Cli::parse(); match cli.command { Commands::New { name, template, output } => { println!("{}", "🚀 NAC Web项目初始化工具".bright_cyan().bold()); println!(); let output_dir = output.unwrap_or_else(|| PathBuf::from(&name)); generator::generate_project(&name, &template, &output_dir)?; println!(); println!("{}", "✅ 项目创建成功!".bright_green().bold()); println!(); println!("下一步:"); println!(" cd {}", name); println!(" npm install"); println!(" npm run dev"); } Commands::List => { template::list_templates(); } Commands::Check { path } => { validator::check_project(&path)?; } } Ok(()) }