use chrono::Timelike; use chrono::{NaiveDate, NaiveTime}; // #[derive(Debug, Clone, sqlx::FromRow)] #[derive(Debug, Clone)] pub struct Event { pub date: NaiveDate, pub start: Option, pub end: Option, pub name: String, } impl Event { pub fn pprint(&self) -> String { let start = self.start.map(pprint_time).unwrap_or_default(); let end = self .end .map(|t| format!("-{}", pprint_time(t))) .unwrap_or_default(); let space = if self.start.is_some() || self.end.is_some() { " " } else { "" }; format!("{}{}{}{}", start, end, space, self.name) } } fn pprint_time(t: NaiveTime) -> String { if t.minute() == 0 { format!("{}h", t.hour()) } else { format!("{}h{}", t.hour(), t.minute()) } } pub fn parse_time(t: &str) -> Option { match t.split('h').collect::>()[..] { [hours, minutes] => { if minutes.trim().is_empty() { NaiveTime::from_hms_opt(hours.parse().ok()?, 0, 0) } else { NaiveTime::from_hms_opt(hours.parse().ok()?, minutes.parse().ok()?, 0) } } _ => None, } }