use std::path::PathBuf;
use clap::{Parser, Subcommand, ValueEnum};
#[derive(Parser)]
#[command(name = "lp_parser")]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
#[arg(short, long, global = true, action = clap::ArgAction::Count)]
pub verbose: u8,
#[arg(short, long, global = true)]
pub quiet: bool,
}
#[derive(Subcommand)]
pub enum Commands {
Parse(ParseArgs),
Info(InfoArgs),
Analyze(AnalyzeArgs),
#[cfg(feature = "diff")]
Diff(DiffArgs),
Convert(ConvertArgs),
#[cfg(feature = "lp-solvers")]
Solve(SolveArgs),
}
#[derive(ValueEnum, Clone, Debug, Default)]
pub enum OutputFormat {
#[default]
Text,
#[cfg(feature = "serde")]
Json,
#[cfg(feature = "serde")]
Yaml,
}
#[derive(clap::Args)]
pub struct ParseArgs {
pub file: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value = "text")]
pub format: OutputFormat,
#[arg(long)]
pub pretty: bool,
}
#[derive(clap::Args)]
#[allow(clippy::struct_excessive_bools)]
pub struct AnalyzeArgs {
pub file: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value = "text")]
pub format: OutputFormat,
#[arg(long)]
pub pretty: bool,
#[arg(long)]
pub issues_only: bool,
#[arg(long, default_value = "1000000000")]
pub large_coeff_threshold: f64,
#[arg(long, default_value = "0.000000001")]
pub small_coeff_threshold: f64,
#[arg(long, default_value = "1000000")]
pub ratio_threshold: f64,
}
#[derive(clap::Args)]
#[allow(clippy::struct_excessive_bools)]
pub struct InfoArgs {
pub file: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value = "text")]
pub format: OutputFormat,
#[arg(long)]
pub pretty: bool,
#[arg(long)]
pub variables: bool,
#[arg(long)]
pub constraints: bool,
#[arg(long)]
pub objectives: bool,
}
#[cfg(feature = "diff")]
#[derive(clap::Args)]
pub struct DiffArgs {
pub file1: PathBuf,
pub file2: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value = "text")]
pub format: OutputFormat,
#[arg(long)]
pub pretty: bool,
#[arg(long, default_value_t = 0.0)]
pub abs_tol: f64,
#[arg(long, default_value_t = 0.0)]
pub rel_tol: f64,
#[arg(long, num_args = 2, value_names = ["PATTERN", "REPLACEMENT"], action = clap::ArgAction::Append)]
pub rename: Vec<String>,
}
#[derive(ValueEnum, Clone, Debug, Default)]
pub enum ConvertFormat {
#[default]
Lp,
#[cfg(feature = "csv")]
Csv,
#[cfg(feature = "serde")]
Json,
#[cfg(feature = "serde")]
Yaml,
}
#[derive(clap::Args)]
pub struct ConvertArgs {
pub file: PathBuf,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value = "lp")]
pub format: ConvertFormat,
#[arg(long)]
pub pretty: bool,
#[arg(long, default_value = "6")]
pub precision: usize,
#[arg(long, default_value = "80")]
pub max_line_length: usize,
#[arg(long)]
pub no_problem_name: bool,
#[arg(long)]
pub compact: bool,
}
#[cfg(feature = "lp-solvers")]
#[derive(ValueEnum, Clone, Debug, Default)]
pub enum Solver {
#[default]
Cbc,
Gurobi,
Cplex,
Glpk,
}
#[cfg(feature = "lp-solvers")]
#[derive(clap::Args)]
pub struct SolveArgs {
pub file: PathBuf,
#[arg(short, long, value_enum, default_value = "cbc")]
pub solver: Solver,
#[arg(short, long)]
pub output: Option<PathBuf>,
#[arg(short, long, value_enum, default_value = "text")]
pub format: OutputFormat,
#[arg(long)]
pub pretty: bool,
}