aboutsummaryrefslogtreecommitdiff
path: root/hatask.ha
diff options
context:
space:
mode:
Diffstat (limited to 'hatask.ha')
-rw-r--r--hatask.ha48
1 files changed, 46 insertions, 2 deletions
diff --git a/hatask.ha b/hatask.ha
index 493c597..291f17e 100644
--- a/hatask.ha
+++ b/hatask.ha
@@ -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);
};
};