diff options
| author | a14m <[email protected]> | 2021-04-01 23:35:51 +0200 |
|---|---|---|
| committer | a14m <[email protected]> | 2021-04-01 23:35:51 +0200 |
| commit | 1a4ff7c28a1dc8ee3e1aa22e8e5941b37e7d1adc (patch) | |
| tree | a0d66e05ac752abd48585d599b4402ca06475052 | |
| parent | 7faaaff2ab17a2571117e4ba93aa2139b2ddb376 (diff) | |
Add CLI Width/Height validations
| -rw-r--r-- | CLI/rust/src/game_of_life.rs | 5 | ||||
| -rw-r--r-- | CLI/rust/src/game_of_life/opts.rs | 40 |
2 files changed, 45 insertions, 0 deletions
diff --git a/CLI/rust/src/game_of_life.rs b/CLI/rust/src/game_of_life.rs index fffaa42..c854e7f 100644 --- a/CLI/rust/src/game_of_life.rs +++ b/CLI/rust/src/game_of_life.rs @@ -1,5 +1,8 @@ use clap::{crate_authors, crate_version, App, Arg, ArgMatches, Error}; +/// Options module for validations and Opts struct +pub(crate) mod opts; + /// Define the Clap CLI for running Game of Life simulation /// /// Using Clap to define the available options that can be used with game of life @@ -29,6 +32,7 @@ pub(crate) fn options() -> Result<ArgMatches, Error> { .about("Specify the width of generated universe. [default: terminal width]") .takes_value(true) .long("width") + .validator(opts::validators::is_fitting_term_width) .display_order(2) ) .arg( @@ -36,6 +40,7 @@ pub(crate) fn options() -> Result<ArgMatches, Error> { .about("Specify the width of generated universe. [default: terminal height]") .takes_value(true) .long("height") + .validator(opts::validators::is_fitting_term_height) .display_order(3) ) .arg( diff --git a/CLI/rust/src/game_of_life/opts.rs b/CLI/rust/src/game_of_life/opts.rs new file mode 100644 index 0000000..c0ece98 --- /dev/null +++ b/CLI/rust/src/game_of_life/opts.rs @@ -0,0 +1,40 @@ +/// Clap validators module +/// +/// Used for validating different CLI args (like width, height and delay) +/// Ref: https://docs.rs/clap/3.0.0-beta.2/clap/struct.Arg.html#method.validator +pub(crate) mod validators { + use terminal_size::{terminal_size, Height, Width}; + + /// Validator to check if width configuration can be used + /// + /// The maximum width allowed is the current terminal window width + pub(crate) fn is_fitting_term_width(val: &str) -> Result<(), String> { + let (Width(term_width), Height(_)) = terminal_size().unwrap(); + match val.parse::<u16>() { + Ok(n) if n > 0 && n <= term_width => Ok(()), + Ok(_) => Err(format!( + "must be between 1 and {} (current terminal width)", + term_width + )), + Err(e) => Err(e.to_string()), + } + } + + /// Validator to check if height configuration can be used + /// + /// The maximum height allowed is the current terminal window height - 2 + /// The last 2 lines are used for status reporting (seed/input) and space + /// for ease of use + pub(crate) fn is_fitting_term_height(val: &str) -> Result<(), String> { + let (Width(_), Height(term_height)) = terminal_size().unwrap(); + let term_height = term_height - 2; + match val.parse::<u16>() { + Ok(n) if n > 0 && n <= term_height => Ok(()), + Ok(_) => Err(format!( + "must be between 1 and {} (current terminal height)", + term_height + )), + Err(e) => Err(e.to_string()), + } + } +} |
