use chrono::{DateTime, Local, Utc}; use colored::Colorize; pub trait IsStation { fn name(&self) -> &str; fn scheduled_arrival(&self) -> Option<&DateTime>; fn real_arrival(&self) -> Option<&DateTime>; fn ds100(&self) -> &str; fn to_fancy_string(&self) -> String { format!( "{} {} – {} ({})", self .real_arrival() // chrono's API for timezones is expressive, but reads like c++ … .map(|t| >::from(*t).time().to_string()) .unwrap_or("??:??:??".to_string()) .blue(), { let delay = match (self.real_arrival(), self.scheduled_arrival()) { (Some(a), Some(s)) => (a.time() - s.time()).num_minutes(), _ => 0 }; let text = format!("({:+})", delay); if delay > 0 { text.red() } else { text.green() } }, self.ds100().red(), self.name() ) } }