use std::path::PathBuf;
use clap::{Parser, Subcommand, ValueEnum};
#[derive(Debug, Parser)]
#[command(name = "cratestack")]
#[command(about = "CrateStack schema tooling")]
#[command(version)]
pub(crate) struct Cli {
#[command(subcommand)]
pub(crate) command: Command,
}
#[derive(Debug, Subcommand)]
pub(crate) enum Command {
Check {
#[arg(long)]
schema: PathBuf,
#[arg(long, value_enum, default_value_t = OutputFormat::Human)]
format: OutputFormat,
},
GenerateDart {
#[arg(long)]
schema: PathBuf,
#[arg(long)]
out: PathBuf,
#[arg(long, default_value = "cratestack_client")]
library_name: String,
#[arg(long, default_value = "/api")]
base_path: String,
#[arg(long)]
template_dir: Option<PathBuf>,
#[arg(long)]
check: bool,
#[arg(long, value_enum, default_value_t = DartPresetArg::Default)]
preset: DartPresetArg,
#[arg(long)]
run_build_runner: bool,
},
#[command(name = "generate-typescript", alias = "generate-ts")]
GenerateTypeScript {
#[arg(long)]
schema: PathBuf,
#[arg(long)]
out: PathBuf,
#[arg(long, default_value = "cratestack-client")]
package_name: String,
#[arg(long, default_value = "/api")]
base_path: String,
#[arg(long)]
template_dir: Option<PathBuf>,
#[arg(long)]
check: bool,
#[arg(long)]
full_selection: bool,
#[arg(long, value_enum, default_value_t = TypeScriptPresetArg::Default)]
preset: TypeScriptPresetArg,
},
#[command(name = "generate-proto")]
GenerateProto {
#[arg(long)]
schema: PathBuf,
#[arg(long)]
out: PathBuf,
#[arg(long)]
package: Option<String>,
#[arg(long)]
check: bool,
},
Studio {
#[command(subcommand)]
cmd: StudioCmd,
},
PrintIr {
#[arg(long)]
schema: PathBuf,
},
Migrate {
#[command(subcommand)]
action: MigrateAction,
},
Diff {
old: PathBuf,
new: PathBuf,
#[arg(long)]
json: bool,
},
}
#[derive(Debug, Subcommand)]
pub(crate) enum StudioCmd {
Init {
#[arg(long, default_value = ".")]
out: PathBuf,
#[arg(long)]
force: bool,
},
Run {
#[arg(long, default_value = "studio.toml")]
config: PathBuf,
#[arg(long)]
bind: Option<String>,
},
Eject {
#[arg(long)]
out: PathBuf,
#[arg(long)]
name: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
with_ui: bool,
},
}
#[derive(Debug, Subcommand)]
pub(crate) enum MigrateAction {
Diff {
#[arg(long)]
schema: PathBuf,
#[arg(long, default_value = "migrations")]
out_dir: PathBuf,
#[arg(long, value_enum, default_value_t = MigrateBackendArg::Both)]
backend: MigrateBackendArg,
#[arg(long, default_value = "migration")]
name: String,
#[arg(long)]
allow_destructive: bool,
},
Baseline {
#[arg(long)]
schema: PathBuf,
#[arg(long)]
database_url: String,
#[arg(long, default_value = "migrations")]
out_dir: PathBuf,
#[arg(long, value_enum, default_value_t = BaselineBackendArg::Postgres)]
backend: BaselineBackendArg,
#[arg(long)]
strict: bool,
},
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub(crate) enum DartPresetArg {
Default,
Riverpod,
}
impl From<DartPresetArg> for cratestack_client_dart::DartPreset {
fn from(value: DartPresetArg) -> Self {
match value {
DartPresetArg::Default => cratestack_client_dart::DartPreset::Default,
DartPresetArg::Riverpod => cratestack_client_dart::DartPreset::Riverpod,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub(crate) enum MigrateBackendArg {
Postgres,
Sqlite,
Both,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub(crate) enum BaselineBackendArg {
Postgres,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub(crate) enum OutputFormat {
Human,
Json,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
pub(crate) enum TypeScriptPresetArg {
Default,
Swr,
}