diff --git a/src/commands/CmdShorten.cpp b/src/commands/CmdShorten.cpp index bba0a265..6a3ac36d 100644 --- a/src/commands/CmdShorten.cpp +++ b/src/commands/CmdShorten.cpp @@ -26,6 +26,7 @@ #include #include +#include #include #include #include @@ -53,8 +54,6 @@ int CmdShorten ( if (! ids.size ()) throw std::string ("IDs must be specified. See 'timew help shorten'."); - // TODO Support :adjust - // Load the data. // Note: There is no filter. Interval filter; @@ -63,37 +62,26 @@ int CmdShorten ( // Apply tags to ids. for (auto& id : ids) { - if (id <= static_cast (tracked.size ())) - { - // Note: It's okay to subtract a one-based number from a zero-based index. - Interval i = tracked[tracked.size () - id]; - if (! i.range.is_open ()) - { - Duration dur (delta); - if (dur < (i.range.end - i.range.start)) - { - database.deleteInterval (tracked[tracked.size () - id]); + if (id > static_cast (tracked.size ())) + throw format ("ID '@{1}' does not correspond to any tracking.", id); - i.range.end -= dur.toTime_t (); - validate (cli, rules, database, i); - database.addInterval (i); + // Note: It's okay to subtract a one-based number from a zero-based index. + Interval i = tracked[tracked.size () - id]; + if (i.range.is_open ()) + throw format ("Cannot shorten open interval @{1}", id); - // Feedback. - if (rules.getBoolean ("verbose")) - std::cout << "Shortened @" << id << " by " << dur.formatHours () << '\n'; - } - else - std::cout << "Cannot shorten interval @" - << id - << " by " - << dur.formatHours () - << " because it is only " - << Duration (i.range.end - i.range.start).formatHours () - << " in length.\n"; - } - else - std::cout << "Cannot shorten open interval @" << id << '\n'; - } + Duration dur (delta); + if (dur >= (i.range.end - i.range.start)) + throw format ("Cannot shorten interval @{1} by {2} because it is only {3} in length.", id, dur.formatHours (), Duration (i.range.end - i.range.start).formatHours ()); + + database.deleteInterval (tracked[tracked.size () - id]); + + i.range.end -= dur.toTime_t (); + validate (cli, rules, database, i); + database.addInterval (i); + + if (rules.getBoolean ("verbose")) + std::cout << "Shortened @" << id << " by " << dur.formatHours () << '\n'; } return 0;