diff options
author | Nicholas Johnson <nick@nicholasjohnson.ch> | 2024-04-01 00:00:00 +0000 |
---|---|---|
committer | Nicholas Johnson <nick@nicholasjohnson.ch> | 2024-04-01 00:00:00 +0000 |
commit | 830754db546245315844e2873c92573280ff55417f4ff1db7c52eeb9d3260282 (patch) | |
tree | 7279350800cb5edeb932b492a181d15ba045d98715fb637384e3813ee2d77e80 /src/main.rs | |
download | hitomezashi-rs-038857b7c28fec83bde085cc13779ca053b1ba470fb1210c335f10316abca5ee.tar.gz hitomezashi-rs-038857b7c28fec83bde085cc13779ca053b1ba470fb1210c335f10316abca5ee.zip |
Initial commitv1.0.0
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..6a44530 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,78 @@ +/* + 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 <https://www.gnu.org/licenses/>. +*/ + +use clap::{Parser, value_parser}; +use colored::Colorize; +use std::process::exit; + +mod hitomezashi; + +#[derive(Parser)] +#[command(version, about, long_about = None)] // Read from `Cargo.toml` +struct Cli { + /// Pattern width + #[arg(value_parser = value_parser!(usize))] + width: usize, + + /// Pattern height + #[arg(value_parser = value_parser!(usize))] + height: usize, + + #[arg(short, long)] + #[arg(default_value_t = 0.5)] + #[arg(value_parser = value_parser!(f32))] + /// Set skew + skew: f32, +} + +/* CLI for hitomezashi */ +fn main() { + let cli = Cli::parse(); + + // validate bounds of width [1..] + if cli.width < 1 { + println!("{} invalid value '{}' for '{}': valid values are [1..]\n\nFor more information, try '{}'.", + "error:".red().bold(), + cli.width.to_string().yellow(), + "<WIDTH>".bold(), + "--help".bold()); + exit(2); + } + + // validate bounds of height [1..] + if cli.height < 1 { + println!("{} invalid value '{}' for '{}': valid values are [1..]\n\nFor more information, try '{}'.", + "error:".red().bold(), + cli.height.to_string().yellow(), + "<HEIGHT>".bold(), + "--help".bold()); + exit(2); + } + + // validate bounds of skew [0-1] + if cli.skew < 0.0 || cli.skew > 1.0 { + println!("{} invalid value '{}' for '{}': valid values are [0-1]\n\nFor more information, try '{}'.", + "error:".red().bold(), + cli.skew.to_string().yellow(), + "--skew <SKEW>".bold(), + "--help".bold()); + exit(2); + } + + hitomezashi::hitomezashi(cli.width, cli.height, Some(cli.skew)); +} |