Have DateTimeWidget include the time zone in its type. #1

Merged
wathiede merged 2 commits from ggriffiniii/i3xs:master into master 2019-10-03 11:19:52 -07:00
2 changed files with 25 additions and 29 deletions
Showing only changes of commit faae3bebca - Show all commits

View File

@ -25,7 +25,7 @@ fn main() {
// Realtime upload/download rate for a interface
bar.push(NetworkSpeedWidget::new(&opts.nic, 6));
let mut dt = DateTimeWidget::tz("%H:%M %Z".to_string(), "Europe/London".to_string());
let mut dt = DateTimeWidget::tz("%H:%M %Z".to_string(), chrono_tz::Europe::London);
dt.set_colors(&vec![
TimeColor {
start: NaiveTime::from_hms(0, 0, 0),

View File

@ -1,18 +1,16 @@
use chrono::NaiveTime;
use chrono_tz::Tz;
use std::fmt::Display;
use chrono::{Local, Utc, NaiveTime, offset::TimeZone};
use i3monkit::Block;
use i3monkit::ColorRGB;
use i3monkit::{Widget, WidgetUpdate};
/// The widget that shows local time
pub struct DateTimeWidget {
pub struct DateTimeWidget<Tz> {
/// fmt to format the datetime, see
/// https://docs.rs/chrono/*/chrono/format/strftime/index.html for documentation.
fmt: String,
/// tz string, values from https://docs.rs/chrono-tz/*/chrono_tz/
/// None will use local time.
tz: Option<String>,
tz: Tz,
colors: Option<Vec<TimeColor>>,
}
@ -22,19 +20,21 @@ pub struct TimeColor {
pub color: ColorRGB,
}
impl DateTimeWidget {
// Create a new time widget
impl DateTimeWidget<Local> {
pub fn new(fmt: String) -> Self {
DateTimeWidget {
fmt,
tz: None,
colors: None,
DateTimeWidget::tz(fmt, Local)
}
}
pub fn tz(fmt: String, tz: String) -> Self {
impl<Tz> DateTimeWidget<Tz>
where
Tz: TimeZone,
Tz::Offset: Display,
Review

I don't get why "Tz::Offset: Display" is used here, can you explain that?

I don't get why "Tz::Offset: Display" is used here, can you explain that?
Review

Well I think it may not actually be necessary here (and should probably be removed), but it is necessary on the Widget impl. Short answer for why it's necessary there is because the compiler said so. Longer answer is because the Widget impl formats the time, which requires displaying the timezone which can only be done if the timezone's offset has a Display impl.

Well I think it may not actually be necessary here (and should probably be removed), but it is necessary on the Widget impl. Short answer for why it's necessary there is because the compiler said so. Longer answer is because the Widget impl formats the time, which requires displaying the timezone which can only be done if the timezone's offset has a Display impl.
{
pub fn tz(fmt: String, tz: Tz) -> Self {
DateTimeWidget {
fmt,
tz: Some(tz),
tz,
colors: None,
}
}
@ -45,19 +45,15 @@ impl DateTimeWidget {
}
}
impl Widget for DateTimeWidget {
impl<Tz> Widget for DateTimeWidget<Tz>
where
Tz: TimeZone,
Tz::Offset: Display,
{
fn update(&mut self) -> Option<WidgetUpdate> {
let (time, time_string) = match &self.tz {
Some(tz) => {
let tz: Tz = tz.parse().unwrap();
let now = chrono::Local::now();
let now = now.with_timezone(&tz);
let (time, time_string) = {
let now = Utc::now().with_timezone(&self.tz);
(now.time(), now.format(&self.fmt).to_string())
}
None => {
let now = chrono::Local::now();
(now.time(), now.format(&self.fmt).to_string())
}
};
let color = if let Some(colors) = &self.colors {
colors
@ -81,7 +77,7 @@ impl Widget for DateTimeWidget {
data.color(color);
}
Some(WidgetUpdate {
refresh_interval: std::time::Duration::new(1, 0),
refresh_interval: std::time::Duration::from_secs(1),
data: Some(data),
})
}