From aed0d02c6499710644a875792b077d9f510a0aff Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 6 Apr 2016 22:51:07 -0400 Subject: [PATCH] CmdTrack: Implemented simple track --- src/commands/CmdTrack.cpp | 49 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/commands/CmdTrack.cpp b/src/commands/CmdTrack.cpp index 180ff71b..599b14c8 100644 --- a/src/commands/CmdTrack.cpp +++ b/src/commands/CmdTrack.cpp @@ -26,6 +26,7 @@ #include #include +#include #include //////////////////////////////////////////////////////////////////////////////// @@ -34,12 +35,54 @@ int CmdTrack ( Rules& rules, Database& database) { - std::cout << "[track: record an old interval]\n"; - // TODO Parse interval. // TODO Parse tags. + std::string start {""}; + std::string end {""}; + std::vector tags; + for (auto& arg : cli._args) + { + if (arg.hasTag ("BINARY") || + arg.hasTag ("CMD")) + continue; + + if (arg.hasTag ("HINT")) + { + expandIntervalHint (arg.attribute ("canonical"), start, end); + } + else if (arg._lextype == Lexer::Type::date) + { + if (start == "") + start = arg.attribute ("raw"); + else if (end == "") + end = arg.attribute ("raw"); + + // TODO Is this workable? Using excess date fields as tags. Might just + // be a coincidence. + else + tags.push_back (arg.attribute ("raw")); + } + else + { + tags.push_back (arg.attribute ("raw")); + } + } + // TODO Add new interval. - // TODO Summarize. + Interval tracked; + tracked.start (Datetime (start)); + tracked.end (Datetime (end)); + for (auto& tag : tags) + tracked.tag (tag); + + // TODO Apply exclusions. + + // Update database. + database.addInterval (tracked); + + // User feedback. + if (rules.getBoolean ("verbose")) + std::cout << intervalSummarize (rules, tracked); return 0; }