edge-util 0.0.1

A utility crate for the wasmer-edge project
Documentation
use std::time::Duration;

/// A trait to simplify construction a [`std::time::Duration`] from numeric types.
///
/// The trait is implemented for the common numeric types, like [`i32`], [`u32`], ...
///
/// Note that for signed integers, the absolute value will be used.
pub trait EasyDuration: Sized {
    fn seconds(self) -> Duration;

    fn minutes(self) -> Duration {
        self.seconds() * 60
    }

    fn hours(self) -> Duration {
        self.seconds() * 60 * 60
    }

    fn days(self) -> Duration {
        self.seconds() * 60 * 60 * 24
    }

    fn years(self) -> Duration {
        self.days() * 365
    }
}

impl EasyDuration for u8 {
    fn seconds(self) -> Duration {
        Duration::from_secs(self.into())
    }
}

impl EasyDuration for u16 {
    fn seconds(self) -> Duration {
        Duration::from_secs(self.into())
    }
}

impl EasyDuration for u32 {
    fn seconds(self) -> Duration {
        Duration::from_secs(self.into())
    }
}

impl EasyDuration for u64 {
    fn seconds(self) -> Duration {
        Duration::from_secs(self)
    }
}

impl EasyDuration for i8 {
    fn seconds(self) -> Duration {
        Duration::from_secs(self.unsigned_abs() as u64)
    }
}

impl EasyDuration for i16 {
    fn seconds(self) -> Duration {
        Duration::from_secs(self.unsigned_abs() as u64)
    }
}

impl EasyDuration for i32 {
    fn seconds(self) -> Duration {
        let secs = self.abs().try_into().unwrap();
        Duration::from_secs(secs)
    }
}

impl EasyDuration for i64 {
    fn seconds(self) -> Duration {
        let secs = self.abs().try_into().unwrap();
        Duration::from_secs(secs)
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_easy_duration() {
        // Seconds.
        assert_eq!(1i8.seconds(), Duration::from_secs(1));
        assert_eq!(1i16.seconds(), Duration::from_secs(1));
        assert_eq!(1i32.seconds(), Duration::from_secs(1));
        assert_eq!(1i64.seconds(), Duration::from_secs(1));
        assert_eq!(1u8.seconds(), Duration::from_secs(1));
        assert_eq!(1u16.seconds(), Duration::from_secs(1));
        assert_eq!(1u32.seconds(), Duration::from_secs(1));
        assert_eq!(1u64.seconds(), Duration::from_secs(1));

        // Minutes
        assert_eq!(1i8.minutes(), Duration::from_secs(60));
        assert_eq!(1i16.minutes(), Duration::from_secs(60));
        assert_eq!(1i32.minutes(), Duration::from_secs(60));
        assert_eq!(1i64.minutes(), Duration::from_secs(60));
        assert_eq!(1u8.minutes(), Duration::from_secs(60));
        assert_eq!(1u16.minutes(), Duration::from_secs(60));
        assert_eq!(1u32.minutes(), Duration::from_secs(60));
        assert_eq!(1u64.minutes(), Duration::from_secs(60));

        // Hours.
        assert_eq!(1i8.hours(), Duration::from_secs(60 * 60));
        assert_eq!(1i16.hours(), Duration::from_secs(60 * 60));
        assert_eq!(1i32.hours(), Duration::from_secs(60 * 60));
        assert_eq!(1i64.hours(), Duration::from_secs(60 * 60));
        assert_eq!(1u8.hours(), Duration::from_secs(60 * 60));
        assert_eq!(1u16.hours(), Duration::from_secs(60 * 60));
        assert_eq!(1u32.hours(), Duration::from_secs(60 * 60));
        assert_eq!(1u64.hours(), Duration::from_secs(60 * 60));

        // Days.
        assert_eq!(1i8.days(), Duration::from_secs(60 * 60 * 24));
        assert_eq!(1i16.days(), Duration::from_secs(60 * 60 * 24));
        assert_eq!(1i32.days(), Duration::from_secs(60 * 60 * 24));
        assert_eq!(1i64.days(), Duration::from_secs(60 * 60 * 24));
        assert_eq!(1u8.days(), Duration::from_secs(60 * 60 * 24));
        assert_eq!(1u16.days(), Duration::from_secs(60 * 60 * 24));
        assert_eq!(1u32.days(), Duration::from_secs(60 * 60 * 24));
        assert_eq!(1u64.days(), Duration::from_secs(60 * 60 * 24));
    }
}