Skip to content

Commit

Permalink
add chrono duration
Browse files Browse the repository at this point in the history
  • Loading branch information
baoyachi committed Mar 15, 2021
1 parent 5e61715 commit 9fd6893
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 2 deletions.
9 changes: 7 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "duration-str"
version = "0.1.3"
version = "0.1.4"
authors = ["baoyachi <liaoymxsdl@gmail.com>"]
edition = "2018"
description = "duration string parser"
Expand All @@ -15,4 +15,9 @@ license = "MIT AND Apache-2.0"

[dependencies]
nom = "6"
anyhow = "1"
anyhow = "1"
chrono = { version = "0.4.19", optional = true }


[dev-dependencies]
chrono = "0.4.19"
71 changes: 71 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,69 @@ pub fn parse(input: &str) -> anyhow::Result<Duration> {
Ok(duration)
}

/// convert Into<String> 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<S: Into<String>>(input: S) -> anyhow::Result<Duration> {
let input = input.into();
parse(input.as_str())
}

/// convert Into<String> 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<S: Into<String>>(input: S) -> anyhow::Result<chrono::Duration> {
let std_duration = parse_std(input)?;
let duration = chrono::Duration::from_std(std_duration)?;
Ok(duration)
}

#[cfg(test)]
mod tests {
use super::*;
Expand Down Expand Up @@ -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))
}
}

0 comments on commit 9fd6893

Please sign in to comment.