use timezone_provider::{epoch_nanoseconds::EpochNanoseconds, provider::TimeZoneProvider};
use crate::{TemporalResult, TimeZone, UtcOffset};
pub trait HostClock {
fn get_host_epoch_nanoseconds(&self) -> TemporalResult<EpochNanoseconds>;
}
pub trait HostTimeZone {
fn get_host_time_zone(
&self,
provider: &(impl TimeZoneProvider + ?Sized),
) -> TemporalResult<TimeZone>;
}
pub trait HostHooks: HostClock + HostTimeZone {
fn get_system_epoch_nanoseconds(&self) -> TemporalResult<EpochNanoseconds> {
self.get_host_epoch_nanoseconds()
}
fn get_system_time_zone(
&self,
provider: &(impl TimeZoneProvider + ?Sized),
) -> TemporalResult<TimeZone> {
self.get_host_time_zone(provider)
}
}
pub struct EmptyHostSystem;
impl HostClock for EmptyHostSystem {
fn get_host_epoch_nanoseconds(&self) -> TemporalResult<EpochNanoseconds> {
Ok(EpochNanoseconds::from_seconds(0))
}
}
impl HostTimeZone for EmptyHostSystem {
fn get_host_time_zone(&self, _: &(impl TimeZoneProvider + ?Sized)) -> TemporalResult<TimeZone> {
Ok(TimeZone::from(UtcOffset::default()))
}
}
impl HostHooks for EmptyHostSystem {}