use crate::commands::{self, jobs::JobsCommand, new::run_new};
use crate::new_options::{CacheBackend, DatabaseBackend, JobsBackend};
use crate::DOIDO_VERSION;
use clap::{Parser, Subcommand};
use doido_controller::axum;
#[derive(Parser)]
#[command(name = "doido", version = DOIDO_VERSION, about = "Doido framework CLI")]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
#[allow(clippy::large_enum_variant)]
enum Commands {
Server {
#[arg(long)]
port: Option<u16>,
#[arg(long)]
env: Option<String>,
},
Routes,
Console,
Db {
#[arg(short, long, global = true)]
verbose: bool,
#[command(subcommand)]
command: commands::db::DbCommand,
},
Jobs {
#[command(subcommand)]
action: JobsCommand,
},
Worker {
#[arg(long)]
once: bool,
},
Credentials {
#[command(subcommand)]
action: commands::credentials::CredentialsCommand,
},
#[command(disable_help_flag = true)]
Generate {
#[arg(trailing_var_arg = true, allow_hyphen_values = true)]
args: Vec<String>,
},
New {
name: String,
#[arg(long)]
non_interactive: bool,
#[arg(long, value_enum)]
database: Option<DatabaseBackend>,
#[arg(long)]
cable: bool,
#[arg(long, value_enum)]
cache: Option<CacheBackend>,
#[arg(long, value_enum)]
jobs: Option<JobsBackend>,
},
}
pub async fn run(routes: Option<axum::Router>) {
let mode = std::env::args()
.skip(1)
.find(|a| !a.starts_with('-'))
.unwrap_or_else(|| "server".to_string());
crate::banner::print(&mode);
let app_config = doido_controller::config::YamlConfig::load().unwrap_or_default();
doido_core::logger::init_with_config(&app_config.logger);
if let Err(e) = doido_core::load_inflections(doido_core::inflector::DEFAULT_CONFIG_PATH) {
doido_core::tracing::warn!("{e}");
}
if std::env::args().nth(1).as_deref() == Some("db") {
commands::db::ensure_database_url_from_config();
}
let cli = Cli::parse();
match cli.command {
Commands::Server { port, env } => commands::server::run(routes, env, port).await,
Commands::Routes => {
if routes.is_some() {
doido_controller::print_routes();
} else {
doido_core::tracing::warn!("no routes configured");
}
}
Commands::Console => commands::console::run(),
Commands::Worker { once } => commands::worker::run(once).await,
Commands::Db { verbose, command } => commands::db::run(command, verbose).await,
Commands::Jobs { action } => commands::jobs::run(action).await,
Commands::Credentials { action } => commands::credentials::run(action),
Commands::Generate { args } => commands::generate::run(&args),
Commands::New {
name,
non_interactive,
database,
cable,
cache,
jobs,
} => {
run_new(&name, non_interactive, database, cable, cache, jobs);
}
}
}