do print the running entries in ical format
This commit is contained in:
parent
744d07b174
commit
fc90f76390
|
@ -43,7 +43,7 @@ impl Formatter {
|
||||||
Formatter::Csv => csv::print_formatted(entries, out, ids)?,
|
Formatter::Csv => csv::print_formatted(entries, out, ids)?,
|
||||||
Formatter::Json => json::print_formatted(entries, out)?,
|
Formatter::Json => json::print_formatted(entries, out)?,
|
||||||
Formatter::Ids => ids::print_formatted(entries, out)?,
|
Formatter::Ids => ids::print_formatted(entries, out)?,
|
||||||
Formatter::Ical => ical::print_formatted(entries, out)?,
|
Formatter::Ical => ical::print_formatted(entries, out, now)?,
|
||||||
Formatter::Custom(name) => {
|
Formatter::Custom(name) => {
|
||||||
panic!("attempted custom formatter with name {} which is not implemented", name);
|
panic!("attempted custom formatter with name {} which is not implemented", name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
|
use chrono::{DateTime, Utc};
|
||||||
|
|
||||||
use crate::models::Entry;
|
use crate::models::Entry;
|
||||||
use crate::error::Result;
|
use crate::error::Result;
|
||||||
|
|
||||||
const ICAL_TIME_FORMAT: &'static str = "%Y%m%dT%H%M%SZ";
|
const ICAL_TIME_FORMAT: &'static str = "%Y%m%dT%H%M%SZ";
|
||||||
|
|
||||||
pub fn print_formatted<W: Write>(entries: Vec<Entry>, out: &mut W) -> Result<()> {
|
pub fn print_formatted<W: Write>(entries: Vec<Entry>, out: &mut W, now: DateTime<Utc>) -> Result<()> {
|
||||||
writeln!(out, "BEGIN:VCALENDAR")?;
|
writeln!(out, "BEGIN:VCALENDAR")?;
|
||||||
writeln!(out, "CALSCALE:GREGORIAN")?;
|
writeln!(out, "CALSCALE:GREGORIAN")?;
|
||||||
writeln!(out, "METHOD:PUBLISH")?;
|
writeln!(out, "METHOD:PUBLISH")?;
|
||||||
|
@ -15,13 +17,13 @@ pub fn print_formatted<W: Write>(entries: Vec<Entry>, out: &mut W) -> Result<()>
|
||||||
let hostname = hostname::get()?;
|
let hostname = hostname::get()?;
|
||||||
let host = hostname.to_string_lossy();
|
let host = hostname.to_string_lossy();
|
||||||
|
|
||||||
for entry in entries.into_iter().filter(|e| e.end.is_some()) {
|
for entry in entries.into_iter() {
|
||||||
let uid = format!("tiempo-{id}", id=entry.id);
|
let uid = format!("tiempo-{id}", id=entry.id);
|
||||||
let note = entry.note.unwrap_or("".into());
|
let note = entry.note.unwrap_or("".into());
|
||||||
|
|
||||||
writeln!(out, "BEGIN:VEVENT")?;
|
writeln!(out, "BEGIN:VEVENT")?;
|
||||||
writeln!(out, "DESCRIPTION:{note}", note=note)?;
|
writeln!(out, "DESCRIPTION:{note}", note=note)?;
|
||||||
writeln!(out, "DTEND:{end}", end=entry.end.unwrap().format(ICAL_TIME_FORMAT).to_string())?;
|
writeln!(out, "DTEND:{end}", end=entry.end.unwrap_or(now).format(ICAL_TIME_FORMAT).to_string())?;
|
||||||
writeln!(out, "DTSTAMP:{start}", start=entry.start.format(ICAL_TIME_FORMAT).to_string())?;
|
writeln!(out, "DTSTAMP:{start}", start=entry.start.format(ICAL_TIME_FORMAT).to_string())?;
|
||||||
writeln!(out, "DTSTART:{start}", start=entry.start.format(ICAL_TIME_FORMAT).to_string())?;
|
writeln!(out, "DTSTART:{start}", start=entry.start.format(ICAL_TIME_FORMAT).to_string())?;
|
||||||
writeln!(out, "SEQUENCE:0")?;
|
writeln!(out, "SEQUENCE:0")?;
|
||||||
|
@ -48,14 +50,15 @@ mod tests {
|
||||||
fn ical_format() {
|
fn ical_format() {
|
||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
let an_hour_ago = now - Duration::hours(1);
|
let an_hour_ago = now - Duration::hours(1);
|
||||||
|
let half_an_hour_ago = now - Duration::minutes(30);
|
||||||
let entries = vec![
|
let entries = vec![
|
||||||
Entry::new_sample(1, an_hour_ago, Some(now)),
|
Entry::new_sample(1, an_hour_ago, Some(half_an_hour_ago)),
|
||||||
Entry::new_sample(2, an_hour_ago, None),
|
Entry::new_sample(2, half_an_hour_ago, None),
|
||||||
];
|
];
|
||||||
|
|
||||||
let mut out = Vec::new();
|
let mut out = Vec::new();
|
||||||
|
|
||||||
print_formatted(entries, &mut out).unwrap();
|
print_formatted(entries, &mut out, now).unwrap();
|
||||||
|
|
||||||
let host = hostname::get().unwrap();
|
let host = hostname::get().unwrap();
|
||||||
let host = host.to_string_lossy();
|
let host = host.to_string_lossy();
|
||||||
|
@ -66,16 +69,25 @@ METHOD:PUBLISH
|
||||||
PRODID:tiempo-rs
|
PRODID:tiempo-rs
|
||||||
VERSION:2.0
|
VERSION:2.0
|
||||||
BEGIN:VEVENT
|
BEGIN:VEVENT
|
||||||
DESCRIPTION:{note}
|
DESCRIPTION:entry 1
|
||||||
DTEND:{end}
|
DTEND:{half_an_hour_ago}
|
||||||
DTSTAMP:{start}
|
DTSTAMP:{an_hour_ago}
|
||||||
DTSTART:{start}
|
DTSTART:{an_hour_ago}
|
||||||
SEQUENCE:0
|
SEQUENCE:0
|
||||||
SUMMARY:{note}
|
SUMMARY:entry 1
|
||||||
UID:tiempo-{id}@{host}
|
UID:tiempo-1@{host}
|
||||||
|
END:VEVENT
|
||||||
|
BEGIN:VEVENT
|
||||||
|
DESCRIPTION:entry 2
|
||||||
|
DTEND:{now}
|
||||||
|
DTSTAMP:{half_an_hour_ago}
|
||||||
|
DTSTART:{half_an_hour_ago}
|
||||||
|
SEQUENCE:0
|
||||||
|
SUMMARY:entry 2
|
||||||
|
UID:tiempo-2@{host}
|
||||||
END:VEVENT
|
END:VEVENT
|
||||||
END:VCALENDAR
|
END:VCALENDAR
|
||||||
", note="entry 1", end=now.format(ICAL_TIME_FORMAT).to_string(),
|
", an_hour_ago=an_hour_ago.format(ICAL_TIME_FORMAT), half_an_hour_ago=half_an_hour_ago.format(ICAL_TIME_FORMAT), now=now.format(ICAL_TIME_FORMAT),
|
||||||
start=an_hour_ago.format(ICAL_TIME_FORMAT).to_string(), id=1, host=host)));
|
host=host)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue