hlfw.ca

todo2

Download patch

ref: 31f93daa0243ea75278ba8a0c2ec6fff87215519
parent: 448f2935f5f49154a3e568ea48e961e963e20aaf
author: Halfwit <halfwit@MacBook-Pro.hitronhub.home>
date: Sat Oct 26 03:34:03 PDT 2019

Initial work on layout, allow for code growth

--- a/Makefile
+++ /dev/null
@@ -1,7 +1,0 @@
-
-# Add foo as a parent node to bar and baz
-foo.done: bar.todo baz.todo
-	grep '( )' $@ && return 1 || touch foo.done
-
-clean:
-	rm -f *.done
--- /dev/null
+++ b/command.go
@@ -1,0 +1,83 @@
+package main
+
+import (
+	"flag"
+	"fmt"
+	"os"
+	"path"
+
+	"github.com/altid/fslib"
+)
+
+// Initialize a command here to run in main
+// Generally we could just run a command based on a case match
+// but should this ever need to scale, this design will help us
+type command struct {
+	mkfile string
+	args   []string
+	runner func(c *command) error
+}
+
+func newCommand(arg string) (*command, error) {
+	c := &command{}
+
+	if arg == "task" {
+		c.runner = task
+		return c, nil
+	}
+	if err := c.setEnv(); err != nil {
+		return nil, err
+	}
+	if err := c.setTask(arg); err != nil {
+		return nil, err
+	}
+	return c, nil
+}
+
+// This is pure bloat at the moment, a hashmap would be fine for mapping args to funcs
+// as would calling a func itself in the case match. We want to future proof against
+// needing to do any additional bookkeeping in the functions themselves
+func (c command) setTask(arg string) error {
+	switch arg {
+	case "init":
+		c.runner = initFile
+	case "list":
+		c.runner = list
+	case "listall":
+		c.runner = listall
+	case "dot":
+		c.runner = dot
+	case "rm":
+		c.args = flag.Args()
+		c.runner = rm
+	case "add":
+		c.args = flag.Args()
+		c.runner = add
+	case "generate":
+		c.runner = generate
+	default:
+		return fmt.Errorf("Unknown command %q", arg)
+	}
+	return nil
+}
+
+func (c command) setEnv() error {
+
+	dir, err := os.Getwd()
+	if err != nil {
+		return err
+	}
+	data, err := fslib.UserShareDir()
+	if err != nil {
+		return err
+	}
+	c.mkfile = path.Join(data, "todo", path.Base(dir))
+	return nil
+}
+
+// Broken out from main because there may be more busywork as things progress
+func (c *command) runCmd() {
+	if c.runner != nil {
+		c.runner(c)
+	}
+}
--- /dev/null
+++ b/runners.go
@@ -1,0 +1,42 @@
+package main
+
+import (
+	"os"
+	"text/template"
+)
+
+var tmpl = template.Must(template.New("new").Parse("{{.name}} test"))
+
+type makefile struct {
+	name string
+}
+
+func initFile(c *command) error {
+
+	wr, err := os.Create(c.mkfile)
+	if err != nil {
+		return err
+	}
+	defer wr.Close()
+	data := &makefile{"test"}
+	return tmpl.Execute(wr, data)
+}
+
+func list(c *command) error {
+	return nil
+}
+func listall(c *command) error {
+	return nil
+}
+func dot(c *command) error {
+	return nil
+}
+func rm(c *command) error {
+	return nil
+}
+func add(c *command) error {
+	return nil
+}
+func generate(c *command) error {
+	return nil
+}
--- /dev/null
+++ b/task.go
@@ -1,0 +1,5 @@
+package main
+
+func task(c *command) error {
+	return nil
+}
--- a/todo
+++ /dev/null
@@ -1,15 +1,0 @@
-#!/bin/sh
-
-# Makefiles will output a list of leaves with incomplete tasks
-#make --keep-going $1 | show_todo
-#make clean $1
-
-case $1 in
-	list) ;;
-	listall) ;;
-	dot) shift
-		make -Bnd --file=$XDG_DATA_HOME/todo2/$@ | makefile2graph >/dev/null || echo Please install https://github.com/lindenb/makefile2graph ;;
-	generate) ;;
-	add) ;;
-	rm) ;;
-esac
--- /dev/null
+++ b/todo.go
@@ -1,0 +1,24 @@
+package main
+
+import (
+	"flag"
+	"log"
+	"os"
+)
+
+var (
+	mkfile = flag.String("mkfile", "", "Alternate Makefile to use")
+)
+
+func main() {
+	flag.Parse()
+	if flag.Lookup("h") != nil {
+		flag.Usage()
+		os.Exit(0)
+	}
+	cmd, err := newCommand(flag.Arg(1))
+	if err != nil {
+		log.Fatal(err)
+	}
+	cmd.runnerCmd()
+}
--- /dev/null
+++ b/vscode.code-workspace
@@ -1,0 +1,7 @@
+{
+	"folders": [
+		{
+			"path": "."
+		}
+	]
+}
\ No newline at end of file