use clap::{Args, Parser, Subcommand};
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, clap::ValueEnum, PartialEq, Eq)]
pub enum TexbsiFormat {
Gif,
Png,
Frames,
}
#[derive(Debug, Clone, Copy, clap::ValueEnum, PartialEq, Eq)]
pub enum GxaFormat {
Gif,
Png,
}
#[derive(Debug, Clone, Copy, clap::ValueEnum, PartialEq, Eq)]
pub enum FntFormat {
Bitmap,
Ttf,
}
#[derive(Debug, Clone, Copy, clap::ValueEnum, PartialEq, Eq)]
pub enum ColFormat {
Png,
Json,
}
#[derive(Args, Debug, Clone)]
pub struct ConvertFileArgs {
#[arg(value_parser)]
pub file: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
}
#[derive(Args, Debug, Clone, Default)]
pub struct AutoConvertArgs {
#[arg(value_parser)]
pub file: Option<PathBuf>,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct TexbsiArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, value_enum, default_value_t = TexbsiFormat::Gif)]
pub format: TexbsiFormat,
#[arg(long, env)]
pub palette: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct GxaArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, value_enum, default_value_t = GxaFormat::Gif)]
pub format: GxaFormat,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct FntArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, value_enum, default_value_t = FntFormat::Bitmap)]
pub format: FntFormat,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct ColArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, value_enum)]
pub format: Option<ColFormat>,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct WldArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, env)]
pub assets: Option<PathBuf>,
#[arg(long, env)]
pub palette: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub terrain_only: bool,
#[arg(long, default_value_t = true, action = clap::ArgAction::Set)]
pub terrain_textures: bool,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct ModelArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, env)]
pub assets: Option<PathBuf>,
#[arg(long, env)]
pub palette: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct RgmArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, env)]
pub assets: Option<PathBuf>,
#[arg(long, env)]
pub palette: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub compress_textures: bool,
}
#[derive(Args, Debug, Clone)]
pub struct RtxArgs {
#[command(flatten)]
pub io: ConvertFileArgs,
#[arg(long, default_value_t = false)]
pub resolve_names: bool,
}
#[derive(Subcommand, Debug, Clone)]
pub enum ConvertCommand {
Texbsi(TexbsiArgs),
Gxa(GxaArgs),
Fnt(FntArgs),
Col(ColArgs),
Wld(WldArgs),
Model(ModelArgs),
Rgm(RgmArgs),
Rtx(RtxArgs),
Sfx(ConvertFileArgs),
Cht(ConvertFileArgs),
Pvo(ConvertFileArgs),
}
#[derive(Args, Debug, Clone)]
#[command(args_conflicts_with_subcommands = true)]
#[command(flatten_help = true)]
pub struct ConvertArgs {
#[command(subcommand)]
pub command: Option<ConvertCommand>,
#[command(flatten)]
pub auto: AutoConvertArgs,
}
#[derive(Args, Debug, Clone)]
pub struct ReadArgs {
#[arg(value_parser)]
pub file: PathBuf,
}
#[derive(Args, Debug, Clone)]
pub struct ScanArgs {
#[arg(value_parser)]
pub dir: PathBuf,
}
#[derive(Parser, Debug)]
#[command(
name = "redguard-preservation",
about = "A CLI tool to parse and analyze ROB and 3D model files from Redguard.",
author,
version,
about
)]
pub struct Opts {
#[command(flatten)]
pub verbose: clap_verbosity_flag::Verbosity<clap_verbosity_flag::InfoLevel>,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
#[clap(alias = "r")]
Read(ReadArgs),
#[clap(alias = "c")]
Convert(ConvertArgs),
#[clap(alias = "s")]
Scan(ScanArgs),
}