use crate::builtins::Now;
use crate::host::HostClock;
use crate::host::HostHooks;
use crate::host::HostTimeZone;
use crate::TemporalResult;
use crate::unix_time::EpochNanoseconds;
use crate::TemporalError;
use crate::TimeZone;
use timezone_provider::provider::TimeZoneProvider;
use web_time::{SystemTime, UNIX_EPOCH};
pub struct Temporal;
impl Temporal {
#[cfg(feature = "sys-local")]
#[deprecated(
since = "0.1.0",
note = "`now` deprecated was not clear about the host system implementation, please use `local_now`"
)]
pub fn now() -> Now<LocalHostSystem> {
Now::new(LocalHostSystem)
}
#[cfg(feature = "sys-local")]
pub fn local_now() -> Now<LocalHostSystem> {
Now::new(LocalHostSystem)
}
#[cfg(feature = "sys")]
pub fn utc_now() -> Now<UtcHostSystem> {
Now::new(UtcHostSystem)
}
}
#[cfg(feature = "sys")]
pub struct UtcHostSystem;
#[cfg(feature = "sys")]
impl HostHooks for UtcHostSystem {}
#[cfg(feature = "sys")]
impl HostClock for UtcHostSystem {
fn get_host_epoch_nanoseconds(&self) -> TemporalResult<EpochNanoseconds> {
get_system_nanoseconds()
}
}
#[cfg(feature = "sys")]
impl HostTimeZone for UtcHostSystem {
fn get_host_time_zone(
&self,
provider: &(impl TimeZoneProvider + ?Sized),
) -> TemporalResult<TimeZone> {
Ok(TimeZone::utc_with_provider(provider))
}
}
#[cfg(feature = "sys-local")]
pub struct LocalHostSystem;
#[cfg(feature = "sys-local")]
impl HostHooks for LocalHostSystem {}
#[cfg(feature = "sys-local")]
impl HostClock for LocalHostSystem {
fn get_host_epoch_nanoseconds(&self) -> TemporalResult<EpochNanoseconds> {
get_system_nanoseconds()
}
}
#[cfg(feature = "sys-local")]
impl HostTimeZone for LocalHostSystem {
fn get_host_time_zone(
&self,
provider: &(impl TimeZoneProvider + ?Sized),
) -> TemporalResult<TimeZone> {
get_system_timezone(provider)
}
}
#[cfg(feature = "sys-local")]
#[inline]
pub(crate) fn get_system_timezone(
provider: &(impl TimeZoneProvider + ?Sized),
) -> TemporalResult<TimeZone> {
iana_time_zone::get_timezone()
.map(|s| TimeZone::try_from_identifier_str_with_provider(&s, provider))
.map_err(|_| TemporalError::general("Error fetching system time"))?
}
pub(crate) fn get_system_nanoseconds() -> TemporalResult<EpochNanoseconds> {
use crate::unix_time::EpochNanoseconds;
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map_err(|_| TemporalError::general("Error fetching system time"))
.map(|d| EpochNanoseconds::from(d.as_nanos() as i128))
}