use core::fmt; use chrono::{DateTime, Utc}; use getset::{Getters}; use uuid::Uuid; use crate::domain::error::DomainError; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct EventColor(u8); impl From for EventColor { fn from(value: u8) -> Self { Self(value) } } impl From for u8 { fn from(color: EventColor) -> Self { color.0 } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Getters)] pub struct TimeRange { #[getset(get = "pub")] starts_at: DateTime, #[getset(get = "pub")] ends_at: DateTime, } impl TimeRange { pub fn new( starts_at: DateTime, ends_at: DateTime, ) -> Result { if starts_at >= ends_at { Err(DomainError::InvalidTimeRange) } else { Ok(Self { starts_at, ends_at }) } } pub fn overlaps(&self, other: &Self) -> bool { self.starts_at < other.ends_at && other.starts_at < self.ends_at } pub fn duration(&self) -> chrono::Duration { self.ends_at - self.starts_at } } #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum Frequency { Daily, Weekly, Monthly, Yearly, } impl fmt::Display for Frequency { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { Frequency::Daily => write!(f, "DAILY"), Frequency::Weekly => write!(f, "WEEKLY"), Frequency::Monthly => write!(f, "MONTHLY"), Frequency::Yearly => write!(f, "YEARLY"), } } } impl std::str::FromStr for Frequency { type Err = DomainError; fn from_str(s: &str) -> Result { match s.to_uppercase().as_str() { "DAILY" => Ok(Frequency::Daily), "WEEKLY" => Ok(Frequency::Weekly), "MONTHLY" => Ok(Frequency::Monthly), "YEARLY" => Ok(Frequency::Yearly), _ => Err(DomainError::InvalidFrequency), } } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct CalendarId(Uuid); impl CalendarId { pub fn new() -> Self { Self(Uuid::new_v4()) } pub fn from_uuid(uuid: Uuid) -> Self { Self(uuid) } pub fn as_uuid(&self) -> Uuid { self.0 } } impl std::fmt::Display for CalendarId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } } impl std::str::FromStr for CalendarId { type Err = uuid::Error; fn from_str(s: &str) -> Result { Ok(Self(Uuid::parse_str(s)?)) } } #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct EventId(Uuid); impl EventId { pub fn new() -> Self { Self(Uuid::new_v4()) } pub fn from_uuid(uuid: Uuid) -> Self { Self(uuid) } pub fn as_uuid(&self) -> Uuid { self.0 } } impl std::fmt::Display for EventId { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } } impl std::str::FromStr for EventId { type Err = uuid::Error; fn from_str(s: &str) -> Result { Ok(Self(Uuid::parse_str(s)?)) } }