use crate::Board;
#[cfg(feature = "gui")]
use crate::gui;
use clap::{Parser, ValueEnum};
use std::str::FromStr;
#[derive(ValueEnum, Copy, Clone, Debug)]
#[rustfmt::skip]
pub enum Alignment {
TopLeft , Top , TopRight ,
Left , Center, Right ,
BottomLeft, Bottom, BottomRight,
}
#[derive(Parser, Debug)]
#[command(version, about)]
pub(crate) struct Args {
#[arg(short, long, default_value_t = 640)]
pub(crate) cols: usize,
#[arg(short, long, default_value_t = 400)]
pub(crate) rows: usize,
#[arg(short, long, value_parser = Board::from_str)]
pub(crate) template: Option<Board>,
#[arg(short, long, value_enum, default_value_t = Alignment::Center)]
pub(crate) align: Alignment,
#[arg(short, long, num_args = 1..=4, allow_negative_numbers = true, requires = "template", conflicts_with_all = ["align", "cols", "rows"])]
pub(crate) padding: Option<Vec<isize>>,
#[arg(short, long)]
pub(crate) generations: Option<usize>,
#[arg(short = 'G', long)]
pub(crate) generation_limit: Option<usize>,
#[cfg(feature = "gui")]
#[arg(short, long, default_value_t=2.0, value_parser = gui::valid_scale, conflicts_with = "no_gui")]
pub(crate) scale: f64,
#[cfg(feature = "gui")]
#[arg(
short = 'x',
long,
requires = "generation_limit",
conflicts_with = "no_gui"
)]
pub(crate) exit_on_finish: bool,
#[cfg(feature = "gui")]
#[arg(long)]
pub(crate) no_gui: bool,
#[arg(short, long, default_value_t = 120)]
pub(crate) ups: u64,
}
pub(crate) fn parse_args() -> Args {
Args::parse()
}