diff --git a/Cargo.toml b/Cargo.toml index 870cd4f..16e0bf2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "duration-str" -version = "0.1.3" +version = "0.1.4" authors = ["baoyachi "] edition = "2018" description = "duration string parser" @@ -15,4 +15,9 @@ license = "MIT AND Apache-2.0" [dependencies] nom = "6" -anyhow = "1" \ No newline at end of file +anyhow = "1" +chrono = { version = "0.4.19", optional = true } + + +[dev-dependencies] +chrono = "0.4.19" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 9a21fe4..02266fe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -216,6 +216,69 @@ pub fn parse(input: &str) -> anyhow::Result { Ok(duration) } +/// convert Into to `std::time::Duration` +/// +/// # Example +/// +/// ```rust +/// +/// 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(); +/// assert_eq!(duration,Duration::new(211,0)); +/// +/// let duration = parse("3m + 31").unwrap(); +/// assert_eq!(duration,Duration::new(211,0)); +/// +/// let duration = parse("1m*10").unwrap(); +/// assert_eq!(duration,Duration::new(600,0)); +/// +/// let duration = parse("1m * 10").unwrap(); +/// assert_eq!(duration,Duration::new(600,0)); +/// ``` +/// +pub fn parse_std>(input: S) -> anyhow::Result { + let input = input.into(); + parse(input.as_str()) +} + +/// convert Into to `chrono::Duration` +/// +/// # Example +/// +/// ```rust +/// +/// use duration_str::parse_chrono; +/// use chrono::Duration; +/// +/// let duration = parse_chrono("1d").unwrap(); +/// assert_eq!(duration,Duration::seconds(24*60*60)); +/// +/// let duration = parse_chrono("3m+31").unwrap(); +/// assert_eq!(duration,Duration::seconds(211)); +/// +/// let duration = parse_chrono("3m + 31").unwrap(); +/// assert_eq!(duration,Duration::seconds(211)); +/// +/// let duration = parse_chrono("1m*10").unwrap(); +/// assert_eq!(duration,Duration::seconds(600)); +/// +/// let duration = parse_chrono("1m * 10").unwrap(); +/// assert_eq!(duration,Duration::seconds(600)); +/// ``` +/// +/// +#[cfg(feature = "chrono")] +pub fn parse_chrono>(input: S) -> anyhow::Result { + let std_duration = parse_std(input)?; + let duration = chrono::Duration::from_std(std_duration)?; + Ok(duration) +} + #[cfg(test)] mod tests { use super::*; @@ -296,4 +359,12 @@ mod tests { fn test_duration_parse7() { assert!(parse("0m+3-5").is_err()) } + + #[test] + #[cfg(feature = "chrono")] + fn test_parse_chrono() { + use chrono::Duration; + let duration = parse_chrono("1m+60+24 ").unwrap(); + assert_eq!(duration, Duration::seconds(144)) + } }