use clap::{Parser, Subcommand};
use colored::Colorize;
use std::path::PathBuf;
mod generate;
mod new;
#[derive(Parser)]
#[command(name = "ultimo")]
#[command(version)]
#[command(about = "Ultimo Framework CLI - Build modern Rust web applications", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Generate {
#[arg(short, long, default_value = ".")]
project: PathBuf,
#[arg(short, long)]
output: PathBuf,
#[arg(short, long)]
watch: bool,
},
New {
name: String,
#[arg(short, long, default_value = "basic")]
template: String,
},
Dev {
#[arg(short, long, default_value = "3000")]
port: u16,
},
Build {
#[arg(short, long, default_value = "release")]
profile: String,
},
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
println!("{}", "⚡ Ultimo Framework CLI".bold().cyan());
println!();
match cli.command {
Commands::Generate {
project,
output,
watch,
} => {
generate::run(project, output, watch).await?;
}
Commands::New { name, template } => {
new::run(name, template).await?;
}
Commands::Dev { port: _ } => {
println!(
"{}",
"`ultimo dev` is not implemented yet (planned for 0.7.0).".yellow()
);
println!("Run your app directly for now: {}", "cargo run".cyan());
}
Commands::Build { profile: _ } => {
println!("{}", "`ultimo build` is not implemented yet.".yellow());
println!(
"Build with cargo for now: {}",
"cargo build --release".cyan()
);
}
}
Ok(())
}