Parses a duration string into a [`Duration`]. Duration strings support the following grammar: DurationString -> Sign? Number Unit String? Sign -> '-' Number -> Digit+ ('.' Digit+)? Digit -> '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' Unit -> 'h' | 'm' | 's' | 'ms' | 'us' | 'ns' String -> DurationString # Examples - `1h` parses as 1 hour
(i: &str)
| 32 | /// - `1ns` parses as 1 nanosecond |
| 33 | /// - `1.5ns` parses as 1 nanosecond (sub-nanosecond durations not supported) |
| 34 | pub fn parse_duration(i: &str) -> IResult<&str, Duration> { |
| 35 | let (i, neg) = opt(parse_negative)(i)?; |
| 36 | if i == "0" { |
| 37 | return Ok((i, Duration::zero())); |
| 38 | } |
| 39 | let (i, duration) = many1(parse_number_unit)(i) |
| 40 | .map(|(i, d)| (i, d.iter().fold(Duration::zero(), |acc, next| acc + *next)))?; |
| 41 | Ok((i, duration * if neg.is_some() { -1 } else { 1 })) |
| 42 | } |
| 43 | |
| 44 | enum Unit { |
| 45 | Nanosecond, |
no test coverage detected