diff options
Diffstat (limited to 'vendor/iana-time-zone/src/lib.rs')
-rw-r--r-- | vendor/iana-time-zone/src/lib.rs | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/vendor/iana-time-zone/src/lib.rs b/vendor/iana-time-zone/src/lib.rs new file mode 100644 index 000000000..fe4e3fb84 --- /dev/null +++ b/vendor/iana-time-zone/src/lib.rs @@ -0,0 +1,113 @@ +#![warn(clippy::all)] +#![warn(clippy::cargo)] +#![warn(clippy::undocumented_unsafe_blocks)] +#![allow(unknown_lints)] +#![warn(missing_copy_implementations)] +#![warn(missing_debug_implementations)] +#![warn(missing_docs)] +#![warn(rust_2018_idioms)] +#![warn(trivial_casts, trivial_numeric_casts)] +#![warn(unused_qualifications)] +#![warn(variant_size_differences)] + +//! get the IANA time zone for the current system +//! +//! This small utility crate provides the +//! [`get_timezone()`](fn.get_timezone.html) function. +//! +//! ```rust +//! // Get the current time zone as a string. +//! let tz_str = iana_time_zone::get_timezone()?; +//! println!("The current time zone is: {}", tz_str); +//! # Ok::<(), iana_time_zone::GetTimezoneError>(()) +//! ``` +//! +//! The resulting string can be parsed to a +//! [`chrono-tz::Tz`](https://docs.rs/chrono-tz/latest/chrono_tz/enum.Tz.html) +//! variant like this: +//! ```ignore +//! let tz_str = iana_time_zone::get_timezone()?; +//! let tz: chrono_tz::Tz = tz_str.parse()?; +//! ``` + +#[allow(dead_code)] +mod ffi_utils; + +#[cfg_attr(target_os = "linux", path = "tz_linux.rs")] +#[cfg_attr(target_os = "windows", path = "tz_windows.rs")] +#[cfg_attr(any(target_os = "macos", target_os = "ios"), path = "tz_macos.rs")] +#[cfg_attr( + all(target_arch = "wasm32", not(target_os = "wasi")), + path = "tz_wasm32.rs" +)] +#[cfg_attr( + any(target_os = "freebsd", target_os = "dragonfly"), + path = "tz_freebsd.rs" +)] +#[cfg_attr( + any(target_os = "netbsd", target_os = "openbsd"), + path = "tz_netbsd.rs" +)] +#[cfg_attr( + any(target_os = "illumos", target_os = "solaris"), + path = "tz_illumos.rs" +)] +#[cfg_attr(target_os = "android", path = "tz_android.rs")] +#[cfg_attr(target_os = "haiku", path = "tz_haiku.rs")] +mod platform; + +/// Error types +#[derive(Debug)] +pub enum GetTimezoneError { + /// Failed to parse + FailedParsingString, + /// Wrapped IO error + IoError(std::io::Error), + /// Platform-specific error from the operating system + OsError, +} + +impl std::error::Error for GetTimezoneError { + fn source(&self) -> Option<&(dyn std::error::Error + 'static)> { + match self { + GetTimezoneError::FailedParsingString => None, + GetTimezoneError::IoError(err) => Some(err), + GetTimezoneError::OsError => None, + } + } +} + +impl std::fmt::Display for GetTimezoneError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> { + f.write_str(match self { + GetTimezoneError::FailedParsingString => "GetTimezoneError::FailedParsingString", + GetTimezoneError::IoError(err) => return err.fmt(f), + GetTimezoneError::OsError => "OsError", + }) + } +} + +impl From<std::io::Error> for GetTimezoneError { + fn from(orig: std::io::Error) -> Self { + GetTimezoneError::IoError(orig) + } +} + +/// Get the current IANA time zone as a string. +/// +/// See the module-level documentation for a usage example and more details +/// about this function. +#[inline] +pub fn get_timezone() -> Result<String, GetTimezoneError> { + platform::get_timezone_inner() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get_current() { + println!("current: {}", get_timezone().unwrap()); + } +} |