@@ -47,7 +47,16 @@ impl LineRange {
4747 }
4848 2 => {
4949 new_range.lower = line_numbers[0].parse()?;
50− new_range.upper = line_numbers[1].parse()?;
50+
51+ new_range.upper = if line_numbers[1].bytes().next().unwrap() == b'+' {
52+ let more_lines = &line_numbers[1][1..]
53+ .parse()
54+ .map_err(|_| "Invalid line number after +")?;
55+ new_range.lower + more_lines
56+ } else {
57+ line_numbers[1].parse()?
58+ };
59+
5160 Ok(new_range)
5261 }
5362 _ => Err(
@@ -100,6 +109,23 @@ fn test_parse_fail() {
100109 assert!(range.is_err());
101110}
102111
112+#[test]
113+fn test_parse_plus() {
114+ let range = LineRange::from("40:+10").expect("Shouldn't fail on test!");
115+ assert_eq!(40, range.lower);
116+ assert_eq!(50, range.upper);
117+}
118+
119+#[test]
120+fn test_parse_plus_fail() {
121+ let range = LineRange::from("40:+z");
122+ assert!(range.is_err());
123+ let range = LineRange::from("40:+-10");
124+ assert!(range.is_err());
125+ let range = LineRange::from("40:+");
126+ assert!(range.is_err());
127+}
128+
103129#[derive(Copy, Clone, Debug, PartialEq)]
104130pub enum RangeCheckResult {
105131 // Within one of the given ranges