From 1b1b731227fa1034bfb0981190c36bbb64438597 Mon Sep 17 00:00:00 2001 From: anonymous Date: Fri, 1 Jun 2018 21:15:50 +0300 Subject: [PATCH] allow listing more than 2 filters --- src/main.rs | 65 ++++++++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/src/main.rs b/src/main.rs index deffe7bf..4ccca7e8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -10,7 +10,6 @@ extern crate clap; extern crate glob; extern crate oxipng; -extern crate regex; use clap::{App, Arg, ArgMatches}; use glob::glob; @@ -18,7 +17,6 @@ use oxipng::AlphaOptim; use oxipng::Deflaters; use oxipng::Headers; use oxipng::{Options, PngError}; -use regex::Regex; use std::collections::HashSet; use std::fs::DirBuilder; use std::path::PathBuf; @@ -441,40 +439,41 @@ fn parse_numeric_range_opts( min_value: u8, max_value: u8, ) -> Result, String> { - let one_item = Regex::new(format!(r"^[{}-{}]$", min_value, max_value).as_ref()).unwrap(); - let multiple_items = Regex::new( - format!( - r"^([{}-{}])(,|-)([{}-{}])$", - min_value, max_value, min_value, max_value - ).as_ref(), - ).unwrap(); + let error_message = "Not a valid input"; let mut items = HashSet::new(); - if one_item.is_match(input) { - items.insert(input.parse::().unwrap()); - return Ok(items); - } - - if let Some(captures) = multiple_items.captures(input) { - let first = captures[1].parse::().unwrap(); - let second = captures[3].parse::().unwrap(); - if first >= second { - return Err("Not a valid input".to_owned()); + // one value + if let Some(one_value) = input.parse::().ok() { + if (min_value <= one_value) && (one_value <= max_value) { + items.insert(one_value); + return Ok(items); } - - match &captures[2] { - "," => { - items.insert(first); - items.insert(second); - } - "-" => for i in first..second + 1 { - items.insert(i); - }, - _ => unreachable!(), - }; - - return Ok(items); } - Err("Not a valid input".to_owned()) + // a range ("A-B") + let range_values = input.split('-').collect::>(); + if range_values.len() == 2 { + let first_opt = range_values[0].parse::().ok(); + let second_opt = range_values[1].parse::().ok(); + if let (Some(first), Some(second)) = (first_opt, second_opt) { + if min_value <= first && first < second && second <= max_value { + for i in first..second + 1 { + items.insert(i); + } + return Ok(items); + } + } + } + + // a list ("A,B[,…]") + for value in input.split(',') { + if let Some(value_int) = value.parse::().ok() { + if (min_value <= value_int) && (value_int <= max_value) && !items.contains(&value_int) { + items.insert(value_int); + continue; + } + } + return Err(error_message.to_owned()); + } + return Ok(items); }