1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
//! Providing wrapper types for safely performing panic-free checked arithmetic //! on instants and durations. //! //! This crate provides the following two data structures. //! //! * [`easytime::Instant`] -- A wrapper type for [`std::time::Instant`] //! //! * [`easytime::Duration`] -- A wrapper type for [`std::time::Duration`] //! //! [`easytime::Instant`]: Instant //! [`easytime::Duration`]: Duration //! //! # Examples //! //! ```rust //! # #[cfg(feature = "std")] //! use easytime::{Duration, Instant}; //! # #[cfg(feature = "std")] //! use std::time::Duration as StdDuration; //! //! # #[cfg(feature = "std")] //! fn foo(secs: u64, nanos: u32, instant: Instant) -> Option<StdDuration> { //! let now = Instant::now(); //! //! let dur = Duration::new(secs, nanos); //! (now - instant - dur).into_inner() //! } //! ``` //! //! If you use [`std::time`] directly, you need to write as follows: //! //! ```rust //! use std::time::{Duration, Instant}; //! //! fn foo(secs: u64, nanos: u32, instant: Instant) -> Option<Duration> { //! let now = Instant::now(); //! //! let secs = Duration::from_secs(secs); //! let nanos = Duration::from_nanos(nanos as u64); //! //! let dur = secs.checked_add(nanos)?; //! now.checked_duration_since(instant)?.checked_sub(dur) //! } //! ``` //! //! # Optional features //! //! * **`std`** *(enabled by default)* //! * Enable to use [`easytime::Instant`]. //! * If disabled this feature, `easytime` can be used in `no_std` environments. #![no_std] #![doc(test( no_crate_inject, attr( deny(warnings, rust_2018_idioms, single_use_lifetimes), allow(dead_code, unused_variables) ) ))] #![forbid(unsafe_code)] #![warn(future_incompatible, rust_2018_idioms, single_use_lifetimes, unreachable_pub)] #![warn(missing_debug_implementations, missing_docs)] #![warn(clippy::all, clippy::default_trait_access)] #[cfg(feature = "std")] extern crate std; mod duration; pub use crate::duration::Duration; #[cfg(feature = "std")] mod instant; #[cfg(feature = "std")] pub use crate::instant::Instant; mod error; pub use crate::error::TryFromTimeError; // ============================================================================= // Utilities #[inline] fn pair_and_then<A, B, C, F>(x: Option<A>, y: Option<B>, f: F) -> Option<C> where F: FnOnce(A, B) -> Option<C>, { match (x, y) { (Some(x), Some(y)) => f(x, y), _ => None, } }