aboutsummaryrefslogtreecommitdiff
path: root/hatask.ha
diff options
context:
space:
mode:
authorJulian Hurst <ark@mansus.space>2024-11-15 01:14:07 +0100
committerJulian Hurst <ark@mansus.space>2024-11-15 01:14:07 +0100
commit4792b321eb3bf7b58fdddcc101a15bd83dad5d0f (patch)
treeda726a995bcc7af2bdfdf42f9571326e4ce7c2be /hatask.ha
parent6a79b5e7c37c846dcb4451d5a2ec33e771e857af (diff)
downloadhatask-4792b321eb3bf7b58fdddcc101a15bd83dad5d0f.tar.gz
Add write, show and filter commands
Diffstat (limited to 'hatask.ha')
-rw-r--r--hatask.ha50
1 files changed, 40 insertions, 10 deletions
diff --git a/hatask.ha b/hatask.ha
index 291f17e..3984165 100644
--- a/hatask.ha
+++ b/hatask.ha
@@ -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..]...)!;
};