-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtasks.go
128 lines (110 loc) · 2.34 KB
/
tasks.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
package main
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
)
type Task struct {
Descr string
Id int
CreateDate time.Time
recurring bool
Score int
}
func serialize(task Task) string {
bytes, err := json.Marshal(task)
_check(err)
return string(bytes)
}
type ParseError struct{}
func (m *ParseError) Error() string {
return "Parse error"
}
func parseInt(str string) int {
i, err := strconv.Atoi(str)
_check(err)
return i
}
func deserialize(str string) (Task, error) {
var task Task
err := json.Unmarshal([]byte(str), &task)
return task, err
}
type TaskManager struct {
taskDir string
daily map[int]Task
dailyId int
backlog map[int]Task
backlogId int
}
func taskListDescr(list map[int]Task) string {
res := []string{}
for _, t := range list {
res = append(res, fmt.Sprint(t.Id, ": ", t.Descr))
}
return strings.Join(res[:], "\n")
}
func (tm TaskManager) dailySumm() string {
return taskListDescr(tm.daily)
}
func (tm TaskManager) backlogSumm() string {
return taskListDescr(tm.backlog)
}
func (tm *TaskManager) addBacklog(descr string) {
tm.backlog[tm.backlogId] = Task{Id: tm.backlogId, Descr: descr, CreateDate: curTime(), recurring: false, Score: 0}
tm.backlogId += 1
}
func (tm *TaskManager) completeDaily(id int) bool {
_, ok := tm.daily[id]
if ok {
delete(tm.daily, id)
}
return ok
}
func (tm *TaskManager) takeToDaily(id int, preserveBacklog bool) bool {
task, ok := tm.backlog[id]
if !ok {
return false
}
task.Id = tm.dailyId
tm.daily[tm.dailyId] = task
tm.dailyId += 1
if !preserveBacklog {
delete(tm.backlog, id)
}
return true
}
func dumpTaskMap(list map[int]Task, path string) {
createFile(path)
var lines []string
for _, t := range list {
lines = append(lines, serialize(t))
}
writeLines(lines, path)
}
func loadTaskMap(list map[int]Task, path string) int {
lines, e := readLines(path)
if e != nil {
return 0
}
maxid := 0
for _, line := range lines {
task, e := deserialize(line)
_check(e)
list[task.Id] = task
if task.Id > maxid {
maxid = task.Id
}
}
return maxid + 1
}
func (tm TaskManager) dump() {
dumpTaskMap(tm.daily, tm.taskDir+"daily")
dumpTaskMap(tm.backlog, tm.taskDir+"backlog")
}
func (tm *TaskManager) load() {
tm.dailyId = loadTaskMap(tm.daily, tm.taskDir+"daily")
tm.backlogId = loadTaskMap(tm.backlog, tm.taskDir+"backlog")
}