Parse integer range in the format n[-end][:step].
()
| 7 | |
| 8 | /// Parse integer range in the format n[-end][:step]. |
| 9 | fn parse_range() -> impl CharParser<IntRange> { |
| 10 | let start = parse_u32().labelled("start"); |
| 11 | let end = just("-").ignore_then(parse_u32()).labelled("end").or_not(); |
| 12 | let step = just(":").ignore_then(parse_u32()).labelled("step").or_not(); |
| 13 | |
| 14 | let parser = start.then(end).then(step); |
| 15 | parser |
| 16 | .try_map(|((start, end), step), span| match (start, end, step) { |
| 17 | (v, None, None) => Ok(IntRange::new(v, 1, 1)), |
| 18 | (v, Some(w), None) if w >= v => Ok(IntRange::new(v, w - v + 1, 1)), |
| 19 | (v, Some(w), Some(x)) if w >= v && x <= w - v && x > 0 => { |
| 20 | Ok(IntRange::new(v, w - v + 1, x)) |
| 21 | } |
| 22 | _ => Err(ParseError::custom(span, "Invalid range")), |
| 23 | }) |
| 24 | .labelled("Integer range") |
| 25 | } |
| 26 | |
| 27 | /// Parses integer ranges separated by commas. |
| 28 | fn parse_ranges() -> impl CharParser<Vec<IntRange>> { |
no test coverage detected