From cd13c85c69cf761b2da84ad91af64d23a3568aa5 Mon Sep 17 00:00:00 2001 From: stuebinm Date: Wed, 9 Feb 2022 02:51:59 +0100 Subject: existential types in rust are weird … lots and lots of traits … --- src/traits.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 src/traits.rs (limited to 'src/traits.rs') diff --git a/src/traits.rs b/src/traits.rs new file mode 100644 index 0000000..a24a689 --- /dev/null +++ b/src/traits.rs @@ -0,0 +1,34 @@ +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() + ) + } +} -- cgit v1.2.3