use std::path::PathBuf;
use clap::{ArgAction, Args, Parser, Subcommand};
#[cfg(feature = "web")]
use std::net::IpAddr;
#[derive(Debug, Parser)]
#[command(
name = "schemaui",
version,
about = "Render JSON Schemas as interactive TUIs or Web UIs"
)]
pub struct Cli {
#[command(flatten)]
pub common: CommonArgs,
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Debug, Subcommand)]
pub enum Commands {
Tui(TuiCommand),
#[cfg(feature = "web")]
Web(WebCommand),
#[cfg(feature = "web")]
WebSnapshot(WebSnapshotCommand),
TuiSnapshot(TuiSnapshotCommand),
}
#[derive(Debug, Args, Clone)]
pub struct TuiCommand {
#[command(flatten)]
pub common: CommonArgs,
}
#[cfg(feature = "web")]
#[derive(Debug, Args, Clone)]
pub struct WebCommand {
#[command(flatten)]
pub common: CommonArgs,
#[rustfmt::skip]
#[arg(alias = "bind", alias = "listen")]
#[arg( short = 'l', long = "host", value_name = "IP", default_value = "127.0.0.1" )]
pub host: IpAddr,
#[arg(short = 'p', long = "port", value_name = "PORT", default_value_t = 0)]
pub port: u16,
}
#[cfg(feature = "web")]
#[derive(Debug, Args, Clone)]
pub struct WebSnapshotCommand {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long = "out-dir", value_name = "DIR", default_value = "web_snapshots")]
pub out_dir: PathBuf,
#[arg(
long = "ts-export",
value_name = "NAME",
default_value = "SessionSnapshot"
)]
pub ts_export: String,
}
#[derive(Debug, Args, Clone)]
pub struct TuiSnapshotCommand {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long = "out-dir", value_name = "DIR", default_value = "tui_artifacts")]
pub out_dir: PathBuf,
#[arg(long = "tui-fn", value_name = "NAME", default_value = "tui_artifacts")]
pub tui_fn: String,
#[arg(
long = "form-fn",
value_name = "NAME",
default_value = "tui_form_schema"
)]
pub form_fn: String,
#[arg(
long = "layout-fn",
value_name = "NAME",
default_value = "tui_layout_nav"
)]
pub layout_fn: String,
}
#[derive(Debug, Args, Clone)]
pub struct CommonArgs {
#[arg(short = 's', long = "schema", value_name = "SPEC")]
pub schema: Option<String>,
#[arg(short = 'c', long = "config", alias = "data", value_name = "SPEC")]
pub config: Option<String>,
#[arg(long = "title", value_name = "TEXT")]
pub title: Option<String>,
#[arg(short = 'o', long = "output", value_name = "DEST", num_args = 1.., action = ArgAction::Append)]
pub outputs: Vec<String>,
#[arg(long = "temp-file", value_name = "PATH")]
pub temp_file: Option<PathBuf>,
#[arg(long = "no-temp-file")]
pub no_temp_file: bool,
#[arg(long = "no-pretty")]
pub no_pretty: bool,
#[arg(short = 'f', long = "force", short_alias = 'y', alias = "yes")]
pub force: bool,
}