Diff

Differences From Artifact [2547f40cdb]:

To Artifact [015d525e31]:


1
2
3
4
5
6
7
8
// tbd, a #tag-based dependency tool for low ceremony task tracking
package main

import (
	"bufio"
	"bytes"
	"fmt"
	"io"
|







1
2
3
4
5
6
7
8
// tbd, a #tag-based dependency tool for task tracking
package main

import (
	"bufio"
	"bytes"
	"fmt"
	"io"
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	extract = regexp.MustCompile("(#)([^\\s]+?)(?:[,\\.\\s]|$)")
}

func main() {

	var (
		exitCode int
		handlers []handler = []handler{counting(), tracing()}
	)

	// Parse command line elements and register handlers
	if len(os.Args) == 1 {
		handlers = append(handlers, cutoff())
	} else {
		handlers = append(handlers, matching(os.Args[1:]))







|







23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
	extract = regexp.MustCompile("(#)([^\\s]+?)(?:[,\\.\\s]|$)")
}

func main() {

	var (
		exitCode int
		handlers = handlerChain{counting(), tracing()}
	)

	// Parse command line elements and register handlers
	if len(os.Args) == 1 {
		handlers = append(handlers, cutoff())
	} else {
		handlers = append(handlers, matching(os.Args[1:]))
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
		exitCode = 1
	}

	os.Exit(exitCode)
}

// Processes input through the provided handlers
func process(input io.Reader, handlers []handler) int {
	reader := bufio.NewReader(input)
	for {
		line, err := reader.ReadString('\n')

		line = strings.TrimSpace(line)
		if len(line) > 0 {
			handle(handlers, &task{tags: parse(line), value: line})
		}

		// Process errors after handling as ReadString can return both data and error f
		if err != nil {
			if err == io.EOF {
				return 0
			}







|






|







58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
		exitCode = 1
	}

	os.Exit(exitCode)
}

// Processes input through the provided handlers
func process(input io.Reader, handlers handlerChain) int {
	reader := bufio.NewReader(input)
	for {
		line, err := reader.ReadString('\n')

		line = strings.TrimSpace(line)
		if len(line) > 0 {
			handlers.do(&task{tags: parse(line), value: line, depends: make(tasks, 0, 8)})
		}

		// Process errors after handling as ReadString can return both data and error f
		if err != nil {
			if err == io.EOF {
				return 0
			}
147
148
149
150
151
152
153



154
155
156
157
158
159
160
161
162
163
164
	// Stop further processing of the task
	stop bool
}

// An alias interface for all task handler functions
type handler func(*task) action




// Execute handlers against a task
func handle(handlers []handler, t *task) {
	for _, h := range handlers {
		act := h(t)
		if act.stop {
			return
		}
	}
}

// Returns a counting handler closure that sets the tasks' nth field







>
>
>

|
|
|







147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
	// Stop further processing of the task
	stop bool
}

// An alias interface for all task handler functions
type handler func(*task) action

// A slice of handlers
type handlerChain []handler

// Execute handlers against a task
func (handlers handlerChain) do(t *task) {
	for _, current := range handlers {
		act := current(t)
		if act.stop {
			return
		}
	}
}

// Returns a counting handler closure that sets the tasks' nth field
214
215
216
217
218
219
220
221

222
223
224
225
226
227
228
				return action{}
			}
		}
		return action{stop: true}
	}
}

// Returns a handler that stores every seen task and an ancillary function to retrieve those

func collecting() (handler, func() tasks) {
	var seen = make(map[*task]bool)
	return func(t *task) action {
			depth := tasks{t}
			for i := 0; i < len(depth); i++ {
				if !seen[depth[i]] {
					seen[depth[i]] = true







|
>







217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
				return action{}
			}
		}
		return action{stop: true}
	}
}

// Returns a handler that stores every seen task and its dependencies
//    along with an ancillary function to retrieve those in a sorted order
func collecting() (handler, func() tasks) {
	var seen = make(map[*task]bool)
	return func(t *task) action {
			depth := tasks{t}
			for i := 0; i < len(depth); i++ {
				if !seen[depth[i]] {
					seen[depth[i]] = true