diff options
author | Bojan Durdevic <bojan88@gmail.com> | 2021-10-11 19:01:00 -0400 |
---|---|---|
committer | David Peter <sharkdp@users.noreply.github.com> | 2021-11-24 07:27:36 +0100 |
commit | bc86c2918526d19ac397de9311bf4068a641772d (patch) | |
tree | 3416201db7ecafcedbff63ee3cc277e29941f31a | |
parent | d2175d6382f797db21f345615dccd5cbb39f22bf (diff) |
Support for line range minus syntax
-rw-r--r-- | src/line_range.rs | 31 |
1 files changed, 30 insertions, 1 deletions
diff --git a/src/line_range.rs b/src/line_range.rs index 1cd3a20d..8cf72095 100644 --- a/src/line_range.rs +++ b/src/line_range.rs @@ -47,12 +47,24 @@ impl LineRange { } 2 => { new_range.lower = line_numbers[0].parse()?; + let first_byte = line_numbers[1].bytes().next(); - new_range.upper = if line_numbers[1].bytes().next() == Some(b'+') { + new_range.upper = if first_byte == Some(b'+') { let more_lines = &line_numbers[1][1..] .parse() .map_err(|_| "Invalid character after +")?; new_range.lower + more_lines + } else if first_byte == Some(b'-') { + // this will prevent values like "-+5" even though "+5" is valid integer + if &line_numbers[1][1..].bytes().next() == &Some(b'+') { + return Err("Invalid character after -".into()); + } + let less_lines = &line_numbers[1][1..] + .parse() + .map_err(|_| "Invalid character after -")?; + let prev_lower = new_range.lower; + new_range.lower = new_range.lower - less_lines; + prev_lower } else { line_numbers[1].parse()? }; @@ -126,6 +138,23 @@ fn test_parse_plus_fail() { assert!(range.is_err()); } +#[test] +fn test_parse_minus_success() { + let range = LineRange::from("40:-10").expect("Shouldn't fail on test!"); + assert_eq!(30, range.lower); + assert_eq!(40, range.upper); +} + +#[test] +fn test_parse_minus_fail() { + let range = LineRange::from("40:-z"); + assert!(range.is_err()); + let range = LineRange::from("40:-+10"); + assert!(range.is_err()); + let range = LineRange::from("40:-"); + assert!(range.is_err()); +} + #[derive(Copy, Clone, Debug, PartialEq)] pub enum RangeCheckResult { // Within one of the given ranges |