use time::{OffsetDateTime, UtcOffset};
pub trait Offset {
fn to_utc(&self) -> UtcOffset;
fn name(&self) -> &str;
fn is_dst(&self) -> bool;
}
pub trait TimeZone {
type Offset: Offset;
fn get_offset_utc(&self, date_time: &OffsetDateTime) -> Self::Offset;
fn get_offset_local(&self, date_time: &OffsetDateTime) -> OffsetResult<Self::Offset>;
fn get_offset_primary(&self) -> Self::Offset;
fn name(&self) -> &str;
}
#[derive(Clone, Copy, Debug)]
pub enum OffsetResult<T> {
Some(T),
Ambiguous(T, T),
None,
}
impl<T> OffsetResult<T> {
pub fn unwrap(self) -> T {
match self {
OffsetResult::Some(v) => v,
OffsetResult::Ambiguous(_, _) => panic!("Attempt to unwrap an ambiguous offset"),
OffsetResult::None => panic!("Attempt to unwrap an invalid offset"),
}
}
pub fn unwrap_first(self) -> T {
match self {
OffsetResult::Some(v) => v,
OffsetResult::Ambiguous(v, _) => v,
OffsetResult::None => panic!("Attempt to unwrap an invalid offset"),
}
}
pub fn unwrap_second(self) -> T {
match self {
OffsetResult::Some(v) => v,
OffsetResult::Ambiguous(_, v) => v,
OffsetResult::None => panic!("Attempt to unwrap an invalid offset"),
}
}
pub fn take(self) -> Option<T> {
match self {
OffsetResult::Some(v) => Some(v),
OffsetResult::Ambiguous(_, _) => None,
OffsetResult::None => None,
}
}
pub fn take_first(self) -> Option<T> {
match self {
OffsetResult::Some(v) => Some(v),
OffsetResult::Ambiguous(v, _) => Some(v),
OffsetResult::None => None,
}
}
pub fn take_second(self) -> Option<T> {
match self {
OffsetResult::Some(v) => Some(v),
OffsetResult::Ambiguous(_, v) => Some(v),
OffsetResult::None => None,
}
}
pub fn is_none(&self) -> bool {
match self {
OffsetResult::Some(_) => false,
OffsetResult::Ambiguous(_, _) => false,
OffsetResult::None => true,
}
}
pub fn is_ambiguous(&self) -> bool {
match self {
OffsetResult::Some(_) => false,
OffsetResult::Ambiguous(_, _) => true,
OffsetResult::None => false,
}
}
}