use anyhow::Result;
use clap::{Parser, Subcommand};
use runique::{
cli::{create_new_project, create_superuser, makemigration, migrate, run_tests, runique_start},
utils::{
init_logging,
trad::{Lang, set_lang},
},
};
#[derive(Parser)]
#[command(name = "runique")]
#[command(about = "Runique framework CLI", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
New { name: String },
Start {
#[arg(long, default_value = "src/main.rs")]
main: String,
#[arg(long, default_value = "src/admin.rs")]
admin: String,
},
CreateSuperuser,
Test {
file: Option<String>,
test: Option<String>,
},
Migration {
#[command(subcommand)]
action: MigrateAction,
},
Makemigrations {
#[arg(long, default_value = "src/entities")]
entities: String,
#[arg(long, default_value = "migration/src")]
migrations: String,
#[arg(long, default_value = "false")]
force: bool,
},
}
#[derive(Subcommand)]
enum MigrateAction {
Up {
#[arg(long, default_value = "migration/src")]
migrations: String,
},
}
#[tokio::main]
async fn main() -> Result<()> {
let _log_guards = init_logging();
dotenvy::dotenv_override().ok();
if let Some(lang) = Lang::from_env() {
set_lang(lang);
}
let cli = Cli::parse();
match cli.command {
Commands::New { name } => create_new_project(&name)?,
Commands::Start { main, admin } => runique_start(&main, &admin)?,
Commands::CreateSuperuser => create_superuser().await?,
Commands::Test { file, test } => run_tests(file.as_deref(), test.as_deref())?,
Commands::Migration { action } => match action {
MigrateAction::Up { migrations } => {
migrate::up(&migrations).await?;
}
},
Commands::Makemigrations {
entities,
migrations,
force,
} => {
makemigration::run(&entities, &migrations, force)?;
}
}
Ok(())
}