aboutsummaryrefslogtreecommitdiff
path: root/hatask.ha
diff options
context:
space:
mode:
Diffstat (limited to 'hatask.ha')
-rw-r--r--hatask.ha27
1 files changed, 27 insertions, 0 deletions
diff --git a/hatask.ha b/hatask.ha
index 534a150..a5d9141 100644
--- a/hatask.ha
+++ b/hatask.ha
@@ -144,11 +144,35 @@ fn strrtaskerror(e: rtaskerror) str = {
};
};
+fn filtertags(cfg: config, tasks: *[]task) void = {
+ if (len(cfg.tags) == 0z) {
+ return;
+ };
+ for (let i = 0z; i < len(tasks); i += 1) {
+ const t = tasks[i];
+ let found = false;
+ for :tagloop (let tag .. t.tags) {
+ for (let tagfilter .. cfg.tags) {
+ if (tag == tagfilter) {
+ found = true;
+ break :tagloop;
+ };
+ };
+ };
+ if (!found) {
+ freetask(&tasks[i]);
+ delete(tasks[i]);
+ i -= 1;
+ };
+ };
+};
+
export fn main() void = {
const cmd = getopt::parse(os::args,
"tasklist",
('f', "path", "tasks directory"),
('c', "context", "context filter"),
+ ('t', "tags", "tags filter"),
('p', "sort by priority"),
("filter", ["filter tasks", "id"]: []getopt::help),
("f", ["filter tasks", "id"]: []getopt::help),
@@ -187,6 +211,8 @@ export fn main() void = {
cfg.tasksdir = strings::dup(opt.1);
case 'c' =>
cfg.context = strings::dup(opt.1);
+ case 't' =>
+ cfg.tags = strings::dupall(strings::split(opt.1, ","));
case 'p' =>
sortfn = &sortpriority;
case =>
@@ -202,6 +228,7 @@ export fn main() void = {
};
defer finishall(tasks);
sort::sort(tasks: []opaque, size(task), sortfn);
+ filtertags(cfg, &tasks);
const com: (str, *getopt::command) = match (cmd.subcmd) {
case void =>