From 3e71413815f8a3f222c755d06d148f9a74222965 Mon Sep 17 00:00:00 2001 From: Abraham Toriz Date: Thu, 24 Jun 2021 09:02:28 -0500 Subject: [PATCH] handle millis in output --- src/formatters.rs | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/formatters.rs b/src/formatters.rs index 64b99d2..6d2ba11 100644 --- a/src/formatters.rs +++ b/src/formatters.rs @@ -3,7 +3,7 @@ use std::io::Write; use serde::{Serialize, Deserialize}; use itertools::Itertools; -use chrono::{DateTime, Utc, Offset, TimeZone, Duration}; +use chrono::{DateTime, Utc, Offset, TimeZone, Duration, NaiveTime, Timelike}; use crate::error; use crate::models::Entry; @@ -12,6 +12,10 @@ fn format_duration(dur: Duration) -> String { format!("{}:{:02}:{:02}", dur.num_hours(), dur.num_minutes() % 60, dur.num_seconds() % 60) } +fn format_time(t: NaiveTime) -> String { + format!("{: >2}:{:02}:{:02}", t.hour(), t.minute(), t.second()) +} + #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "lowercase")] pub enum Formatter { @@ -57,8 +61,8 @@ impl Formatter { let mut daily = Duration::seconds(0); for (i,entry) in entries.into_iter().enumerate() { - let start = fixed_offset.from_utc_datetime(&entry.start.naive_utc()).time().to_string(); - let end = entry.end.map(|t| fixed_offset.from_utc_datetime(&t.naive_utc()).time().to_string()).unwrap_or(" ".into()); + let start = format_time(fixed_offset.from_utc_datetime(&entry.start.naive_utc()).time()); + let end = entry.end.map(|t| format_time(fixed_offset.from_utc_datetime(&t.naive_utc()).time())).unwrap_or(" ".into()); let duration = entry.end.unwrap_or(now) - entry.start; daily = daily + duration; let duration = format_duration(duration); @@ -150,6 +154,28 @@ mod tests { 4:00:00 ----------------------------------------------------------- Total 8:00:00 +")); + } + + #[test] + fn test_text_output_with_millis() { + let formatter = Formatter::Text; + let mut output = Vec::new(); + let entries = vec![ + Entry::new_sample(1, Utc.ymd(2008, 10, 3).and_hms_milli(12, 0, 0, 432), Some(Utc.ymd(2008, 10, 3).and_hms_milli(14, 0, 0, 312))), + ]; + + let now = Utc.ymd(2008, 10, 5).and_hms(20, 0, 0); + let offset = Utc; + + formatter.print_formatted(entries, &mut output, now, offset).unwrap(); + + assert_eq!(PrettyString(&String::from_utf8_lossy(&output)), PrettyString("Timesheet: default + Day Start End Duration Notes + Fri Oct 03, 2008 12:00:00 - 14:00:00 1:59:59 entry 1 + 1:59:59 + ----------------------------------------------------------- + Total 1:59:59 ")); } }