durstr 0.5.1

A simple library for parsing human-readable strings into durations.
Documentation
use std::time::Duration;

use durstr::{Error, Parser, ParserOptions, ParserUnits, parse};

#[test]
fn test_parsing() {
    let d = parse("2 minutes, 12 seconds");
    assert_eq!(d, Ok(Duration::from_secs(120 + 12)));

    let d = parse("45 msecs");
    assert_eq!(d, Ok(Duration::from_millis(45)));

    let d = parse("21 minutes 12 seconds");
    assert_eq!(d, Ok(Duration::from_secs(1272)));

    let d = parse("1 hr 2 mins 3 secs");
    assert_eq!(d, Ok(Duration::from_secs(3723)));

    let d = parse("1h 2min 3s 62ms");
    assert_eq!(d, Ok(Duration::from_millis(3723062)));

    let d = parse("1h2min3s62ms");
    assert_eq!(d, Ok(Duration::from_millis(3723062)));

    let d = parse("2min 3s62ms");
    assert_eq!(d, Ok(Duration::from_millis(123062)));

    let d = parse("2min 1*2 sec");
    assert_eq!(d, Err(Error::UnexpectedChar('*')));

    let d = parse("2 min 1 r");
    assert_eq!(d, Err(Error::UnexpectedUnit("r".to_owned())));

    let d = parse("2.1 min");
    assert_eq!(d, Err(Error::UnexpectedChar('.')));

    let d = parse("1 2");
    assert_eq!(d, Err(Error::ExpectedUnit));

    let d = parse("1 s m");
    assert_eq!(d, Err(Error::ExpectedNumber));
}

#[test]
fn test_parsing_case_sensitivity() {
    let parser = Parser::new(ParserOptions::default());

    let d = parser.parse("1 min 2 sec");
    assert_eq!(d, Ok(Duration::from_secs(62)));

    let d = parser.parse("1 Min 2 sec");
    assert_eq!(d, Err(Error::UnexpectedUnit("Min".to_owned())));

    let d = parser.parse("1 min 2 seC");
    assert_eq!(d, Err(Error::UnexpectedUnit("seC".to_owned())));

    let parser = Parser::new(ParserOptions::default().ignore_case(true));

    let d = parser.parse("1 min 2 sec");
    assert_eq!(d, Ok(Duration::from_secs(62)));

    let d = parser.parse("1 Min 2 sec");
    assert_eq!(d, Ok(Duration::from_secs(62)));

    let d = parser.parse("1 min 2 seC");
    assert_eq!(d, Ok(Duration::from_secs(62)));

    let d = parser.parse("1 MIN 2 SEC");
    assert_eq!(d, Ok(Duration::from_secs(62)));
}

#[test]
fn test_parsing_custom_units() {
    let mut units = ParserUnits::default();
    units.add_unit("day", Duration::from_secs(3600) * 24);
    let parser = Parser::new(ParserOptions::default().with_units(units));

    let d = parser.parse("1 day");
    assert_eq!(d, Ok(Duration::from_secs(3600) * 24));

    let d = parser.parse("4 day");
    assert_eq!(d, Ok(Duration::from_secs(3600) * 24 * 4));
}