summaryrefslogtreecommitdiffstats
path: root/CLI/rust
diff options
context:
space:
mode:
authora14m <[email protected]>2021-04-01 23:35:51 +0200
committera14m <[email protected]>2021-04-01 23:35:51 +0200
commit1a4ff7c28a1dc8ee3e1aa22e8e5941b37e7d1adc (patch)
treea0d66e05ac752abd48585d599b4402ca06475052 /CLI/rust
parent7faaaff2ab17a2571117e4ba93aa2139b2ddb376 (diff)
Add CLI Width/Height validations
Diffstat (limited to 'CLI/rust')
-rw-r--r--CLI/rust/src/game_of_life.rs5
-rw-r--r--CLI/rust/src/game_of_life/opts.rs40
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()),
+ }
+ }
+}