use clap::{Parser, Subcommand};
use std::path::PathBuf;
mod commands;
mod generators;
mod parser;
#[derive(Parser)]
#[command(name = "domainstack")]
#[command(about = "Generate TypeScript validators, JSON Schema, and more from Rust validation rules", long_about = None)]
#[command(version)]
struct Cli {
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
#[command(about = "Generate Zod validation schemas from Rust types")]
Zod(ZodArgs),
#[command(about = "Generate JSON Schema from Rust types")]
JsonSchema(JsonSchemaArgs),
#[command(about = "Generate OpenAPI spec from Rust types")]
Openapi(OpenApiArgs),
}
#[derive(Parser)]
pub struct ZodArgs {
#[arg(short, long, default_value = "src")]
pub input: PathBuf,
#[arg(short, long)]
pub output: PathBuf,
#[arg(short, long)]
pub watch: bool,
#[arg(short, long)]
pub verbose: bool,
}
#[derive(Parser)]
pub struct JsonSchemaArgs {
#[arg(short, long, default_value = "src")]
pub input: PathBuf,
#[arg(short, long)]
pub output: PathBuf,
#[arg(short, long)]
pub watch: bool,
#[arg(short, long)]
pub verbose: bool,
}
#[derive(Parser)]
pub struct OpenApiArgs {
#[arg(short, long, default_value = "src")]
pub input: PathBuf,
#[arg(short, long)]
pub output: PathBuf,
#[arg(long)]
pub openapi_31: bool,
#[arg(short, long)]
pub watch: bool,
#[arg(short, long)]
pub verbose: bool,
}
fn main() -> anyhow::Result<()> {
let cli = Cli::parse();
match cli.command {
Commands::Zod(args) => commands::zod::run(args)?,
Commands::JsonSchema(args) => commands::json_schema::run(args)?,
Commands::Openapi(args) => commands::openapi::run(args)?,
}
Ok(())
}