use std::fmt;
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct TimeEvent {
#[serde(rename = "date", with = "time::serde::rfc3339")]
pub date: time::OffsetDateTime,
#[serde(rename = "type")]
pub r#type: Type,
}
impl TimeEvent {
#[must_use]
pub const fn new() -> Self {
Self {
date: time::OffsetDateTime::UNIX_EPOCH,
r#type: Type::Unknown,
}
}
pub fn is_past(&self) -> bool {
self.date < time::OffsetDateTime::now_utc()
}
pub fn is_future(&self) -> bool {
self.date > time::OffsetDateTime::now_utc()
}
}
impl Default for TimeEvent {
fn default() -> Self {
Self::new()
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)]
pub enum Type {
#[serde(rename = "OPEN")]
Open,
#[serde(rename = "PRE_MARKET_OPEN")]
PreMarketOpen,
#[serde(rename = "AFTER_HOURS_OPEN")]
AfterHoursOpen,
#[serde(rename = "BREAK_START")]
BreakStart,
#[serde(rename = "BREAK_END")]
BreakEnd,
#[serde(rename = "CLOSE")]
Close,
#[serde(rename = "AFTER_HOURS_CLOSE")]
AfterHoursClose,
#[serde(rename = "OVERNIGHT_OPEN")]
OvernightOpen,
Unknown,
}
impl fmt::Display for Type {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Open => write!(f, "Open"),
Self::PreMarketOpen => write!(f, "Pre-market open"),
Self::AfterHoursOpen => write!(f, "After-hours open"),
Self::BreakStart => write!(f, "Break start"),
Self::BreakEnd => write!(f, "Break end"),
Self::Close => write!(f, "Close"),
Self::AfterHoursClose => write!(f, "After-hours close"),
Self::Unknown => write!(f, "Unknown"),
Self::OvernightOpen => write!(f, "Overnight Open"),
}
}
}
impl Default for Type {
fn default() -> Self {
Self::Open
}
}