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