use std::ffi::OsString;
use std::path::PathBuf;
use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(
name = "empu",
version,
about = "Empu — Purwa CLI (Artisan-equivalent)"
)]
pub struct Cli {
#[arg(
long,
global = true,
help = "Print files that would be written and their contents"
)]
pub dry_run: bool,
#[arg(long, global = true, help = "Print extra diagnostics")]
pub verbose: bool,
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Subcommand)]
pub enum Commands {
New(NewArgs),
Serve(ServeArgs),
Dev(DevArgs),
Build(BuildArgs),
#[command(name = "route:list")]
RouteList(RouteListArgs),
Migrate(MigrateArgs),
#[command(name = "migrate:rollback")]
MigrateRollback(MigrateArgs),
#[command(name = "migrate:fresh")]
MigrateFresh(MigrateArgs),
#[command(name = "make:request")]
MakeRequest(MakeRequestArgs),
#[command(name = "make:auth")]
MakeAuth(MakeAuthArgs),
#[command(name = "make:controller")]
MakeController(MakeControllerArgs),
#[command(name = "make:service")]
MakeService(MakeServiceArgs),
#[command(name = "make:model")]
MakeModel(MakeModelArgs),
#[command(name = "make:migration")]
MakeMigration(MakeMigrationArgs),
#[command(name = "make:seeder")]
MakeSeeder(MakeSeederArgs),
#[command(name = "make:job")]
MakeJob(MakeJobArgs),
#[command(name = "make:policy")]
MakePolicy(DeferredArgs),
#[command(name = "db:seed")]
DbSeed(DbSeedArgs),
#[command(name = "queue:work")]
QueueWork(QueueWorkArgs),
#[command(name = "queue:cron")]
QueueCron(QueueCronArgs),
#[command(name = "inertia:setup")]
InertiaSetup(InertiaSetupArgs),
}
#[derive(Parser)]
pub struct NewArgs {
pub name: Option<String>,
#[arg(long)]
pub output: Option<PathBuf>,
#[arg(long)]
pub auth: bool,
#[arg(long)]
pub inertia: bool,
#[arg(long)]
pub purwa_path: Option<PathBuf>,
#[arg(long, default_value_t = 3000)]
pub port: u16,
#[arg(long)]
pub yes: bool,
}
#[derive(Parser)]
pub struct ServeArgs {
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<PathBuf>,
#[arg(long, value_name = "NAME")]
pub bin: Option<String>,
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
pub cargo_args: Vec<OsString>,
}
#[derive(Parser)]
pub struct DevArgs {
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<PathBuf>,
#[arg(long, default_value = "run")]
pub watch_cmd: String,
}
#[derive(Parser)]
pub struct BuildArgs {
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<PathBuf>,
}
#[derive(Parser)]
pub struct RouteListArgs {
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<PathBuf>,
#[arg(long)]
pub json: bool,
}
#[derive(Parser)]
pub struct MigrateArgs {
#[arg(long, env = "DATABASE_URL")]
pub database_url: Option<String>,
#[arg(long)]
pub config: Option<PathBuf>,
#[arg(long, default_value = "database/migrations")]
pub migrations_dir: PathBuf,
}
#[derive(Parser)]
pub struct MakeRequestArgs {
pub name: String,
#[arg(long)]
pub output: Option<PathBuf>,
}
#[derive(Parser)]
pub struct MakeAuthArgs {
#[arg(long, default_value = "database/migrations")]
pub migrations_dir: PathBuf,
#[arg(long)]
pub output: Option<PathBuf>,
}
#[derive(Parser)]
pub struct MakeControllerArgs {
pub name: String,
#[arg(long)]
pub output: Option<PathBuf>,
}
#[derive(Parser)]
pub struct MakeServiceArgs {
pub name: String,
#[arg(long)]
pub output: Option<PathBuf>,
}
#[derive(Parser)]
pub struct MakeModelArgs {
pub name: String,
#[arg(long)]
pub output: Option<PathBuf>,
#[arg(long)]
pub sea_orm: bool,
}
#[derive(Parser)]
pub struct MakeMigrationArgs {
pub name: String,
#[arg(long, default_value = "database/migrations")]
pub migrations_dir: PathBuf,
}
#[derive(Parser)]
pub struct MakeSeederArgs {
pub name: String,
#[arg(long, value_name = "DIR")]
pub output_dir: Option<PathBuf>,
}
#[derive(Parser)]
pub struct MakeJobArgs {
pub name: String,
#[arg(long, value_name = "DIR")]
pub output_dir: Option<PathBuf>,
}
#[derive(Parser)]
pub struct DbSeedArgs {
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<PathBuf>,
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
pub cargo_args: Vec<OsString>,
}
#[derive(Parser)]
pub struct QueueWorkArgs {
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<PathBuf>,
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
pub cargo_args: Vec<OsString>,
}
#[derive(Parser)]
pub struct QueueCronArgs {
#[arg(long, value_name = "PATH")]
pub manifest_path: Option<PathBuf>,
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
pub cargo_args: Vec<OsString>,
}
#[derive(Parser)]
pub struct InertiaSetupArgs {
#[arg(long, default_value = "frontend")]
pub output: PathBuf,
#[arg(long, default_value_t = 3000)]
pub backend_port: u16,
#[arg(long)]
pub force: bool,
}
#[derive(Parser)]
pub struct DeferredArgs {}