aion 0.1.1

A friendly Rust duration and datetime utility crate
Documentation
use chrono::{DateTime, Duration, Utc};

pub trait DurationExtension {
    fn weeks(self) -> Duration;
    fn days(self) -> Duration;
    fn hours(self) -> Duration;
    fn minutes(self) -> Duration;
    fn seconds(self) -> Duration;
    fn milliseconds(self) -> Duration;
    fn microseconds(self) -> Duration;
    fn nanoseconds(self) -> Duration;
}

pub trait DateTimeExtension {
    fn ago(self) -> DateTime<Utc>;
    fn later(self) -> DateTime<Utc>;
    fn from_now(self) -> DateTime<Utc>;
}

impl DurationExtension for i64 {
    fn weeks(self) -> Duration {
        Duration::weeks(self)
    }

    fn days(self) -> Duration {
        Duration::days(self)
    }

    fn hours(self) -> Duration {
        Duration::hours(self)
    }

    fn minutes(self) -> Duration {
        Duration::minutes(self)
    }

    fn seconds(self) -> Duration {
        Duration::seconds(self)
    }

    fn milliseconds(self) -> Duration {
        Duration::milliseconds(self)
    }

    fn microseconds(self) -> Duration {
        Duration::microseconds(self)
    }

    fn nanoseconds(self) -> Duration {
        Duration::nanoseconds(self)
    }
}

impl DateTimeExtension for Duration {
    fn ago(self) -> DateTime<Utc> {
        Utc::now() - self
    }

    fn later(self) -> DateTime<Utc> {
        Utc::now() + self
    }

    fn from_now(self) -> DateTime<Utc> {
        Utc::now() + self
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use chrono::{Duration, Utc};

    #[test]
    fn it_works() {
        assert_eq!(2 + 2, 4);
    }

    #[test]
    fn duration() {
        assert_eq!(2.weeks(), Duration::weeks(2));
        assert_eq!(2.days(), Duration::days(2));
        assert_eq!(2.hours(), Duration::hours(2));
        assert_eq!(2.minutes(), Duration::minutes(2));
        assert_eq!(2.seconds(), Duration::seconds(2));
    }

    #[test]
    fn days_later() {
        assert_eq!(2.days().later(), Utc::now() + Duration::days(2));
    }

    #[test]
    fn days_ago() {
        assert_eq!(2.days().ago(), Utc::now() - Duration::days(2));
    }
}