From c10eedb6af1c8e77fcd4d584d3783f92dfaf85f2f9ec3a1317eb44ae40ec6293 Mon Sep 17 00:00:00 2001 From: Nicholas Johnson Date: Mon, 22 Apr 2024 00:00:00 +0000 Subject: Move cli functionality out of main.rs --- src/cli.rs | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/cli.rs (limited to 'src/cli.rs') diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..bc22a0f --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,75 @@ +/* + hitomezashi-rs Generates classical colored Hitomezashi stitch patterns + Copyright (C) 2024 Nicholas Johnson + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +use clap::Parser; +use std::ops::RangeInclusive; + +#[derive(Parser)] +#[command(version, about, long_about = None)] // Read from `Cargo.toml` +struct Cli { + /// Pattern width + #[arg(value_parser = dimension_in_range)] + width: usize, + + /// Pattern height + #[arg(value_parser = dimension_in_range)] + height: usize, + + /// Set skew + #[arg(short, long)] + #[arg(default_value_t = 0.5)] + #[arg(value_parser = skew_in_range)] + skew: f64, +} + + +const DIMENSION_RANGE: RangeInclusive = 1..=std::usize::MAX; + +fn dimension_in_range(s: &str) -> Result { + let dimension: usize = s + .parse() + .map_err(|_| format!("`{s}` isn't a dimension value!"))?; + + if DIMENSION_RANGE.contains(&dimension) { + Ok(dimension) + } else { + Err(format!( + "Dimension not in range {}-{}", + DIMENSION_RANGE.start(), + DIMENSION_RANGE.end() + )) + } +} + +const SKEW_RANGE: RangeInclusive = 0.0..=1.0; + +fn skew_in_range(s: &str) -> Result { + let skew: f64 = s + .parse() + .map_err(|_| format!("`{s}` isn't a skew value!"))?; + + if SKEW_RANGE.contains(&skew) { + Ok(skew) + } else { + Err(format!( + "Skew not in range {}-{}", + SKEW_RANGE.start(), + SKEW_RANGE.end() + )) + } +} -- cgit v1.2.3