Crate duration_str

source ·
Expand description

Parse string to Duration .

The String value unit support for one of:[“y”,“mon”,“w”,“d”,“h”,“m”,“s”, “ms”, “µs”, “ns”]

  • y:Year. Support string value: [“y” | “year” | “Y” | “YEAR” | “Year”]. e.g. 1y

  • mon:Month.Support string value: [“mon” | “MON” | “Month” | “month” | “MONTH”]. e.g. 1mon

  • w:Week.Support string value: [“w” | “W” | “Week” | “WEEK” | “week”]. e.g. 1w

  • d:Day.Support string value: [“d” | “D” | “Day” | “DAY” | “day”]. e.g. 1d

  • h:Hour.Support string value: [“h” | “H” | “hr” | “Hour” | “HOUR” | “hour”]. e.g. 1h

  • m:Minute.Support string value: [“m” | “M” | “Minute” | “MINUTE” | “minute” | “min” | “MIN”]. e.g. 1m

  • s:Second.Support string value: [“s” | “S” | “Second” | “SECOND” | “second” | “sec” | “SEC”]. e.g. 1s

  • ms:Millisecond.Support string value: [“ms” | “MS” | “Millisecond” | “MilliSecond” | “MILLISECOND” | “millisecond” | “mSEC” ]. e.g. 1ms

  • µs:Microsecond.Support string value: [“µs” | “µS” | “µsecond” | “us” | “uS” | “usecond” | “Microsecond” | “MicroSecond” | “MICROSECOND” | “microsecond” | “µSEC”]. e.g. 1µs

  • ns:Nanosecond.Support string value: [“ns” | “NS” | “Nanosecond” | “NanoSecond” | “NANOSECOND” | “nanosecond” | “nSEC”]. e.g. 1ns

Also, duration_str support time duration simple evaluation(+,*). See examples below.

§Example

use duration_str::parse;
use std::time::Duration;

let duration = parse("1d").unwrap();
assert_eq!(duration, Duration::new(24 * 60 * 60, 0));

let duration = parse("3m+31").unwrap(); //the default duration unit is second.
assert_eq!(duration, Duration::new(211, 0));

let duration = parse("3m + 31").unwrap(); //the default duration unit is second.
assert_eq!(duration, Duration::new(211, 0));

let duration = parse("3m + 13s + 29ms").unwrap();
assert_eq!(duration, Duration::new(193, 29 * 1000 * 1000 + 0 + 0));

let duration = parse("3m + 1s + 29ms +17µs").unwrap();
assert_eq!(
    duration,
    Duration::new(181, 29 * 1000 * 1000 + 17 * 1000 + 0)
);

let duration = parse("3m 1s 29ms 17µs").unwrap();
assert_eq!(
    duration,
    Duration::new(181, 29 * 1000 * 1000 + 17 * 1000 + 0)
);

let duration = parse("3m1s29ms17us").unwrap();
assert_eq!(
    duration,
    Duration::new(181, 29 * 1000 * 1000 + 17 * 1000 + 0)
);

let duration = parse("1m*10").unwrap(); //the default duration unit is second.
assert_eq!(duration, Duration::new(600, 0));

let duration = parse("1m*10ms").unwrap();
assert_eq!(duration, Duration::new(0, 600 * 1000 * 1000));

let duration = parse("1m * 1ns").unwrap();
assert_eq!(duration, Duration::new(0, 60));

let duration = parse("1m * 1m").unwrap();
assert_eq!(duration, Duration::new(3600, 0));
let duration = parse("42µs").unwrap();
assert_eq!(duration,Duration::from_micros(42));

§deserialize to std::time::Duration

use duration_str::deserialize_duration;
use serde::*;
use std::time::Duration;

/// Uses `deserialize_duration`.
#[derive(Debug, Deserialize)]
struct Config {
    #[serde(deserialize_with = "deserialize_duration")]
    time_ticker: Duration,
}

fn needless_main() {
    let json = r#"{"time_ticker":"1m+30"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(config.time_ticker, Duration::new(60 + 30, 0));

    let json = r#"{"time_ticker":"1m+30s"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(config.time_ticker, Duration::new(60 + 30, 0));

    let json = r#"{"time_ticker":"3m 1s 29ms 17µs"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(
        config.time_ticker,
        Duration::new(181, 29 * 1000 * 1000 + 17 * 1000 + 0)
    );

    let json = r#"{"time_ticker":"3m1s29ms17us"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(
        config.time_ticker,
        Duration::new(181, 29 * 1000 * 1000 + 17 * 1000 + 0)
    );
}

§deserialize to chrono::Duration

use chrono::Duration;
use duration_str::deserialize_duration_chrono;
use serde::*;

#[derive(Debug, Deserialize)]
struct Config {
    #[serde(deserialize_with = "deserialize_duration_chrono")]
    time_ticker: Duration,
}

fn needless_main() {
    let json = r#"{"time_ticker":"1m+30"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(config.time_ticker, Duration::seconds(60 + 30));

    let json = r#"{"time_ticker":"1m+30s"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(config.time_ticker, Duration::seconds(60 + 30));

    let json = r#"{"time_ticker":"3m 1s 29ms 17µs"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(
        config.time_ticker,
        Duration::minutes(3)
            + Duration::seconds(1)
            + Duration::milliseconds(29)
            + Duration::microseconds(17)
    );

    let json = r#"{"time_ticker":"3m1s29ms17us"}"#;
    let config: Config = serde_json::from_str(json).unwrap();
    assert_eq!(
        config.time_ticker,
        Duration::minutes(3)
            + Duration::seconds(1)
            + Duration::milliseconds(29)
            + Duration::microseconds(17)
    );
}

Traits§

Functions§

Type Aliases§