handle millis in output

This commit is contained in:
Abraham Toriz 2021-06-24 09:02:28 -05:00
parent be406d9211
commit 3e71413815
No known key found for this signature in database
GPG Key ID: D5B4A746DB5DD42A
1 changed files with 29 additions and 3 deletions

View File

@ -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
"));
}
}