use std::cmp::Ord;
use filters::filter::Filter;
use itertools::Itertools;
use chrono::NaiveDateTime;
use failure::Fallible as Result;
use failure::Error;
use resiter::Filter as RFilter;
use libimagtimetrack::store::TimeTrackStore;
use libimagtimetrack::iter::filter::*;
use libimagtimetrack::timetracking::TimeTracking;
use libimagrt::runtime::Runtime;
pub fn cont(rt: &Runtime) -> Result<()> {
let groups = rt.store()
.get_timetrackings()?
.filter_ok(|e| has_end_time.filter(&e))
.collect::<Result<Vec<_>>>()?
.into_iter()
.group_by(|elem| match elem.get_end_datetime() { Err(_) => NaiveDateTime::from_timestamp(0, 0), Ok(Some(dt)) => dt,
Ok(None) => {
error!("Has no end time, but should be filtered out: {:?}", elem);
error!("This is a bug. Please report.");
error!("Will panic now");
panic!("Unknown bug")
}
});
let elements = {
let mut v = vec![];
for (key, value) in groups.into_iter() {
v.push((key, value));
}
v.into_iter()
.sorted_by(|t1, t2| {
let (k1, _) = *t1;
let (k2, _) = *t2;
Ord::cmp(&k1, &k2)
})
.last() };
match elements {
Some((_, trackings)) => {
trackings
.collect::<Vec<_>>()
.into_iter()
.map(|tracking| {
debug!("Having tracking: {:?}", tracking);
let val = tracking
.get_timetrack_tag()
.and_then(|tag| rt.store().create_timetracking_now(&tag))
.map(|_| 0)?;
rt.report_touched(tracking.get_location()).map_err(Error::from).map(|_| val)
})
.collect::<Result<Vec<_>>>()
.map(|_| ())
},
None => {
info!("No trackings to continue");
Ok(())
},
}
}