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 | 6a79b5e7c37c846dcb4451d5a2ec33e771e857af (patch) | |
| tree | fe470ea6f0b2936716ad8b127e66ca7c175a5332 /hatask.ha | |
| parent | 5fa7f3419bf5b2eb10cb2923ec47341075f84805 (diff) | |
| download | hatask-6a79b5e7c37c846dcb4451d5a2ec33e771e857af.tar.gz | |
Implement reading task meta
Diffstat (limited to 'hatask.ha')
| -rw-r--r-- | hatask.ha | 48 |
1 files changed, 46 insertions, 2 deletions
@@ -1,12 +1,15 @@ use fmt; use dirs; use bufio; +use memio; use os; use fs; use path; use io; use strings; use format::ini; +use strconv; +use encoding::utf8; type task = struct { name: str, @@ -17,7 +20,10 @@ type task = struct { def METADATASEP: str = "----"; -fn listtasks(root: str = "tasks", context: str = "*") ([]task | fs::error | +type rtaskerror = !(fs::error | ini::error | strconv::error | io::error | + utf8::invalid); + +fn listtasks(root: str = "tasks", context: str = "*") ([]task | rtaskerror | path::error) = { const dirents = os::readdir(root)?; defer fs::dirents_free(dirents); @@ -30,23 +36,61 @@ fn listtasks(root: str = "tasks", context: str = "*") ([]task | fs::error | 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)!; }; }; }; return tasks; }; -fn readtask(taskpath: str) (task | fs::error) = { +fn readtask(taskpath: str) (task | rtaskerror) = { const f = os::open(taskpath)?; defer io::close(f)!; const sc = bufio::newscanner(f); defer bufio::finish(&sc); + const meta = memio::dynamic(); + defer io::close(&meta)!; for (let line => bufio::scan_line(&sc)?) { line = strings::trim(line); if (line == METADATASEP) { break; }; + memio::concat(&meta, line, "\n")?; + //append(inilines, strings::dup(line)); + }; + // seek to start of memio buffer + io::seek(&meta, 0, io::whence::SET)?; + const sc = ini::scan(&meta); + defer ini::finish(&sc); + let t = task { + context = void, + tags = void, + ... + }; + for (let entry: ini::entry => ini::next(&sc)?) { + switch (entry.1) { + case "name" => + t.name = strings::dup(entry.2); + case "priority" => + t.priority = strconv::stou(entry.2)?; + case => + void; + }; + }; + return t; +}; +fn freetask(t: *task) void = { + free(t.name); + if (t.context is str) { + free(t.context as str); + }; + if (t.tags is []str) { + strings::freeall(t.tags as []str); }; }; |
