diff --git a/imag-timetrack/src/day.rs b/imag-timetrack/src/day.rs index 0c3fdcd1..04d36044 100644 --- a/imag-timetrack/src/day.rs +++ b/imag-timetrack/src/day.rs @@ -17,9 +17,103 @@ // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // +use std::cmp::Ord; +use std::cmp::Ordering; +use std::str::FromStr; + +use filters::ops::not::Not; +use filters::filter::Filter; +use itertools::Itertools; +use itertools::MinMaxResult; +use chrono::NaiveDateTime; + +use libimagerror::trace::trace_error; +use libimagerror::trace::MapErrTrace; +use libimagerror::iter::TraceIterator; +use libimagstore::store::FileLockEntry; +use libimagentrytimetrack::timetrackingstore::TimeTrackStore; +use libimagentrytimetrack::timetracking::TimeTracking; +use libimagentrytimetrack::tag::TimeTrackingTag; +use libimagentrytimetrack::iter::filter::*; + use libimagrt::runtime::Runtime; + pub fn day(rt: &Runtime) -> i32 { - unimplemented!() + let (_, cmd) = rt.cli().subcommand(); + let cmd = cmd.unwrap(); // checked in main() + + let filter = { + let start = match cmd.value_of("start").map(::chrono::naive::NaiveDateTime::from_str) { + None => ::chrono::offset::Local::today().and_hms(0, 0, 0).naive_local(), + Some(Ok(dt)) => dt, + Some(Err(e)) => { + trace_error(&e); + return 1 + } + }; + + let end = match cmd.value_of("end").map(::chrono::naive::NaiveDateTime::from_str) { + None => ::chrono::offset::Local::today().and_hms(23, 59, 59).naive_local(), + Some(Ok(dt)) => dt, + Some(Err(e)) => { + trace_error(&e); + return 1 + } + }; + + let tags = cmd + .values_of("tags") + .map(|ts| ts.into_iter().map(String::from).map(TimeTrackingTag::from).collect()); + + let start_time_filter = has_start_time_where(move |dt: &NaiveDateTime| { + start <= *dt + }); + + let end_time_filter = has_end_time_where(move |dt: &NaiveDateTime| { + end >= *dt + }); + + let tags_filter = move |fle: &FileLockEntry| { + match tags { + Some(ref tags) => has_one_of_tags(&tags).filter(fle), + None => true, + } + }; + + tags_filter.and(start_time_filter).and(end_time_filter) + }; + + rt.store() + .get_timetrackings() + .and_then(|iter| { + iter.trace_unwrap() + .filter(|e| filter.filter(e)) + .fold(Ok(()), |acc, e| { + acc.and_then(|_| { + debug!("Processing {:?}", e.get_location()); + + let tag = try!(e.get_timetrack_tag()); + debug!(" -> tag = {:?}", tag); + + let start = try!(e.get_start_datetime()); + debug!(" -> start = {:?}", start); + + let end = try!(e.get_end_datetime()); + debug!(" -> end = {:?}", end); + + match (start, end) { + (None, _) => println!("{} has no start time.", tag), + (Some(s), None) => println!("{} | {} - ...", tag, s), + (Some(s), Some(e)) => println!("{} | {} - {}", tag, s, e), + } + + Ok(()) + }) + }) + }) + .map(|_| 0) + .map_err_trace() + .unwrap_or(1) }