aboutsummaryrefslogtreecommitdiff
path: root/hatask.ha
diff options
context:
space:
mode:
authorJulian Hurst <ark@mansus.space>2024-11-15 14:02:30 +0100
committerJulian Hurst <ark@mansus.space>2024-11-15 16:29:05 +0100
commite5d2f4eb34e6d6820a9f05855abe6a45994c4bd2 (patch)
tree70ab2fdea956c8c2276347c4c1c73b2dff443f25 /hatask.ha
parentba38c9e073db90b530f2ba4460fb124a930ea055 (diff)
downloadhatask-e5d2f4eb34e6d6820a9f05855abe6a45994c4bd2.tar.gz
Support -t flag and tags config field for filtering tasks by tags
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 =>