use clap::{Parser, Subcommand, ValueEnum};
#[derive(Parser)]
#[command(name = "authkit")]
#[command(author, version, about = "AuthKit database schema management CLI")]
#[command(propagate_version = true)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[arg(short, long, global = true)]
pub verbose: bool,
}
#[derive(Subcommand)]
pub enum Commands {
Init(InitArgs),
Generate(GenerateArgs),
Migrate(MigrateArgs),
Status(StatusArgs),
Destroy(DestroyArgs),
Schema(SchemaArgs),
}
#[derive(Parser)]
pub struct InitArgs {
#[arg(long, value_enum, default_value = "postgres")]
pub db: DatabaseType,
#[arg(long, default_value = "./authkit.toml")]
pub output: String,
#[arg(long)]
pub force: bool,
}
#[derive(Parser)]
pub struct GenerateArgs {
#[arg(long, default_value = "./authkit.toml")]
pub config: String,
#[arg(long, default_value = "./migrations")]
pub output: String,
#[arg(long)]
pub force: bool,
}
#[derive(Parser)]
pub struct MigrateArgs {
#[arg(long, env = "AUTHKIT_DATABASE_URL")]
pub db_url: String,
#[arg(long, default_value = "./authkit.toml")]
pub config: String,
#[arg(long)]
pub dry_run: bool,
}
#[derive(Parser)]
pub struct StatusArgs {
#[arg(long, env = "AUTHKIT_DATABASE_URL")]
pub db_url: String,
#[arg(long, default_value = "./authkit.toml")]
pub config: String,
}
#[derive(Parser)]
pub struct DestroyArgs {
#[arg(long, env = "AUTHKIT_DATABASE_URL")]
pub db_url: String,
#[arg(long)]
pub force: bool,
}
#[derive(Parser)]
pub struct SchemaArgs {
#[arg(long, default_value = "./authkit.toml")]
pub config: Option<String>,
#[arg(long, value_enum)]
pub db: Option<DatabaseType>,
#[arg(long, value_enum, default_value = "sql")]
pub format: OutputFormat,
#[arg(long, env = "AUTHKIT_DATABASE_URL")]
pub db_url: Option<String>,
}
#[derive(Clone, Copy, ValueEnum, Debug, PartialEq, Eq)]
pub enum DatabaseType {
Sqlite,
Postgres,
}
impl std::fmt::Display for DatabaseType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DatabaseType::Sqlite => write!(f, "sqlite"),
DatabaseType::Postgres => write!(f, "postgres"),
}
}
}
#[derive(Clone, Copy, ValueEnum)]
pub enum OutputFormat {
Sql,
Json,
Table,
}