use crate::provider::{MetazoneId, TimeZoneBcp47Id};
use crate::metazone::MetazoneCalculator;
use crate::{GmtOffset, TimeZoneError, ZoneVariant};
use core::str::FromStr;
use icu_calendar::{DateTime, Iso};
#[derive(Debug)]
#[allow(clippy::exhaustive_structs)] pub struct CustomTimeZone {
pub gmt_offset: Option<GmtOffset>,
pub time_zone_id: Option<TimeZoneBcp47Id>,
pub metazone_id: Option<MetazoneId>,
pub zone_variant: Option<ZoneVariant>,
}
impl CustomTimeZone {
pub const fn new_with_offset(gmt_offset: GmtOffset) -> Self {
Self {
gmt_offset: Some(gmt_offset),
time_zone_id: None,
metazone_id: None,
zone_variant: None,
}
}
pub const fn new_empty() -> Self {
Self {
gmt_offset: None,
time_zone_id: None,
metazone_id: None,
zone_variant: None,
}
}
pub const fn utc() -> Self {
Self {
gmt_offset: Some(GmtOffset::utc()),
time_zone_id: None,
metazone_id: None,
zone_variant: None,
}
}
pub fn try_from_bytes(bytes: &[u8]) -> Result<Self, TimeZoneError> {
let gmt_offset = GmtOffset::try_from_bytes(bytes)?;
Ok(Self {
gmt_offset: Some(gmt_offset),
time_zone_id: None,
metazone_id: None,
zone_variant: None,
})
}
pub fn maybe_calculate_metazone(
&mut self,
metazone_calculator: &MetazoneCalculator,
local_datetime: &DateTime<Iso>,
) -> &mut Self {
if let Some(time_zone_id) = self.time_zone_id {
self.metazone_id =
metazone_calculator.compute_metazone_from_time_zone(time_zone_id, local_datetime);
}
self
}
}
impl FromStr for CustomTimeZone {
type Err = TimeZoneError;
fn from_str(input: &str) -> Result<Self, Self::Err> {
CustomTimeZone::try_from_bytes(input.as_bytes())
}
}