diff options
| author | Julian Hurst <ark@mansus.space> | 2024-11-15 01:14:07 +0100 |
|---|---|---|
| committer | Julian Hurst <ark@mansus.space> | 2024-11-15 01:14:07 +0100 |
| commit | 4792b321eb3bf7b58fdddcc101a15bd83dad5d0f (patch) | |
| tree | da726a995bcc7af2bdfdf42f9571326e4ce7c2be /hatask.ha | |
| parent | 6a79b5e7c37c846dcb4451d5a2ec33e771e857af (diff) | |
| download | hatask-4792b321eb3bf7b58fdddcc101a15bd83dad5d0f.tar.gz | |
Add write, show and filter commands
Diffstat (limited to 'hatask.ha')
| -rw-r--r-- | hatask.ha | 50 |
1 files changed, 40 insertions, 10 deletions
@@ -10,12 +10,14 @@ use strings; use format::ini; use strconv; use encoding::utf8; +use getopt; type task = struct { name: str, context: (str | void), tags: ([]str | void), priority: uint, + content: str, }; def METADATASEP: str = "----"; @@ -35,12 +37,10 @@ fn listtasks(root: str = "tasks", context: str = "*") ([]task | rtaskerror | const p = path::push(&buf, root, dirent.name)?; listtasks(p)?; } else { - fmt::println(dirent.name)!; let buf = path::init()?; const p = path::push(&buf, root, dirent.name)?; let t = readtask(p)?; - defer freetask(&t); - fmt::println(t.name)!; + append(tasks, t); }; }; }; @@ -52,15 +52,19 @@ fn readtask(taskpath: str) (task | rtaskerror) = { defer io::close(f)!; const sc = bufio::newscanner(f); defer bufio::finish(&sc); + const content = memio::dynamic(); + defer io::close(&content)!; const meta = memio::dynamic(); defer io::close(&meta)!; + + let currentst = &meta; for (let line => bufio::scan_line(&sc)?) { line = strings::trim(line); if (line == METADATASEP) { - break; + currentst = &content; + continue; }; - memio::concat(&meta, line, "\n")?; - //append(inilines, strings::dup(line)); + memio::concat(currentst, line, "\n")?; }; // seek to start of memio buffer io::seek(&meta, 0, io::whence::SET)?; @@ -74,18 +78,23 @@ fn readtask(taskpath: str) (task | rtaskerror) = { for (let entry: ini::entry => ini::next(&sc)?) { switch (entry.1) { case "name" => - t.name = strings::dup(entry.2); + t.name = strings::dup(strings::trim(entry.2)); case "priority" => t.priority = strconv::stou(entry.2)?; case => void; }; }; + if (t.name == "") { + t.name = strings::dup(path::basename(taskpath)); + }; + t.content = strings::dup(strings::trim(memio::string(&content)?)); return t; }; fn freetask(t: *task) void = { free(t.name); + free(t.content); if (t.context is str) { free(t.context as str); }; @@ -94,13 +103,34 @@ fn freetask(t: *task) void = { }; }; +fn finishall(tasks: []task) void = { + for (const task .. tasks) { + freetask(&task); + }; +}; + export fn main() void = { - match (listtasks()) { + const cmd = getopt::parse(os::args, + "tasklist", + "cmd", + ); + defer getopt::finish(&cmd); + + const com: []str = if (len(cmd.args) > 0) { + yield cmd.args; + } else { + yield ["filter"]; + }; + + const tasks = match (listtasks()) { case let e: fs::error => fmt::fatal(fs::strerror(e)); case let e: path::error => fmt::fatal(path::strerror(e)); - case => - void; + case let tasks: []task => + yield tasks; }; + defer finishall(tasks); + + execcommand(com[0], tasks, com[1..]...)!; }; |
