1 // Copyright 2015-2016 Brian Smith. 2 // 3 // Permission to use, copy, modify, and/or distribute this software for any 4 // purpose with or without fee is hereby granted, provided that the above 5 // copyright notice and this permission notice appear in all copies. 6 // 7 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES 8 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR 10 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 12 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 13 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 15 //! Conversions into the library's time type. 16 17 /// The time type. 18 /// 19 /// Internally this is merely a UNIX timestamp: a count of non-leap 20 /// seconds since the start of 1970. This type exists to assist 21 /// unit-of-measure correctness. 22 #[derive(Debug, Clone, Copy, PartialEq, PartialOrd)] 23 pub struct Time(u64); 24 25 impl Time { 26 /// Create a `webpki::Time` from a unix timestamp. 27 /// 28 /// It is usually better to use the less error-prone 29 /// `webpki::Time::try_from(time: std::time::SystemTime)` instead when 30 /// `std::time::SystemTime` is available (when `#![no_std]` isn't being 31 /// used). 32 #[allow(clippy::must_use_candidate)] from_seconds_since_unix_epoch(secs: u64) -> Self33 pub fn from_seconds_since_unix_epoch(secs: u64) -> Self { 34 Self(secs) 35 } 36 } 37 38 #[cfg(feature = "std")] 39 impl core::convert::TryFrom<std::time::SystemTime> for Time { 40 type Error = std::time::SystemTimeError; 41 42 /// Create a `webpki::Time` from a `std::time::SystemTime`. 43 /// 44 /// # Example: 45 /// 46 /// Construct a `webpki::Time` from the current system time: 47 /// 48 /// ``` 49 /// # extern crate ring; 50 /// # extern crate webpki; 51 /// # 52 /// #![cfg(feature = "std")] 53 /// use std::{convert::TryFrom, time::{SystemTime, SystemTimeError}}; 54 /// 55 /// # fn foo() -> Result<(), SystemTimeError> { 56 /// let time = webpki::Time::try_from(SystemTime::now())?; 57 /// # Ok(()) 58 /// # } 59 /// ``` try_from(value: std::time::SystemTime) -> Result<Self, Self::Error>60 fn try_from(value: std::time::SystemTime) -> Result<Self, Self::Error> { 61 value 62 .duration_since(std::time::UNIX_EPOCH) 63 .map(|d| Self::from_seconds_since_unix_epoch(d.as_secs())) 64 } 65 } 66