Bladeren bron

Implement basic reminding functionality

Lucas Stadler 9 jaren geleden
bovenliggende
commit
6d9107718c
1 gewijzigde bestanden met toevoegingen van 105 en 20 verwijderingen
  1. 105 20
      go/remind/remind.go

+ 105 - 20
go/remind/remind.go

@ -1,32 +1,117 @@
1 1
package main
2 2
3 3
import (
4
	"encoding/json"
5
	"flag"
4 6
	"fmt"
7
	"os"
8
	"sort"
9
	"time"
5 10
)
6 11
12
type Reminder struct {
13
	Date        time.Time `json:"date"`
14
	Description string    `json:"description"`
15
}
16
17
type byDate []Reminder
18
19
func (r byDate) Len() int           { return len(r) }
20
func (r byDate) Less(i, j int) bool { return r[i].Date.Before(r[j].Date) }
21
func (r byDate) Swap(i, j int)      { r[i], r[j] = r[j], r[i] }
22
23
var flags struct {
24
	showAll bool
25
}
26
27
func init() {
28
	flag.BoolVar(&flags.showAll, "all", false, "Show all reminders")
29
}
30
7 31
func main() {
8
	dates := []string{
9
		"today",
10
		"tomorrow",
11
		"tomorrow at 3am",
12
		"in 3 days",
13
		"in a month",
14
		"in 3 months",
15
		"next week",
16
		"next month",
17
		"in two weeks",
18
		"in 3 weeks",
19
		"2016-09-28",
20
		"3pm",
21
		"in 4 days at 10 pm",
32
	flag.Parse()
33
34
	cmd := "list"
35
	if flag.NArg() >= 1 {
36
		cmd = flag.Arg(0)
22 37
	}
23
	for _, d := range dates {
24
		fmt.Printf("'%s': ", d)
25
		t, err := parseTime(d)
38
39
	needWrite := false
40
	f, err := os.OpenFile("remind.json", os.O_RDWR, 0644)
41
	if err != nil && !os.IsNotExist(err) {
42
		exit(err)
43
	}
44
	defer f.Close()
45
46
	var reminders []Reminder
47
	if err == nil {
48
		dec := json.NewDecoder(f)
49
		err = dec.Decode(&reminders)
26 50
		if err != nil {
27
			fmt.Printf("%s\n", err)
28
		} else {
29
			fmt.Printf("%s\n", t)
51
			exit(err)
30 52
		}
31 53
	}
54
55
	switch cmd {
56
	case "list", "l":
57
		min := time.Now()
58
		max := min.AddDate(0, 0, 7)
59
60
		if flag.NArg() > 1 {
61
			switch flag.Arg(1) {
62
			case "today":
63
				min = truncateHours(time.Now())
64
				max = min.Add(24 * time.Hour)
65
			}
66
		}
67
68
		sort.Sort(byDate(reminders))
69
		for _, r := range reminders {
70
			if flags.showAll || (r.Date.After(min) && r.Date.Before(max)) {
71
				fmt.Printf("%s - %s\n", r.Date, r.Description)
72
			}
73
		}
74
	case "add":
75
		if flag.NArg() != 3 {
76
			flag.Usage()
77
			os.Exit(1)
78
		}
79
80
		date, err := parseTime(flag.Arg(1))
81
		if err != nil {
82
			exit(err)
83
		}
84
		description := flag.Arg(2)
85
		reminders = append(reminders, Reminder{Date: date, Description: description})
86
		needWrite = true
87
	default:
88
		fmt.Fprintf(os.Stderr, "unknown command '%s'\n", cmd)
89
		os.Exit(1)
90
	}
91
92
	if needWrite {
93
		if f == nil {
94
			f, err = os.Create("remind.json")
95
			if err != nil {
96
				exit(err)
97
			}
98
		}
99
100
		_, err = f.Seek(0, 0)
101
		if err != nil {
102
			exit(err)
103
		}
104
105
		enc := json.NewEncoder(f)
106
		err = enc.Encode(reminders)
107
		if err != nil {
108
			exit(err)
109
		}
110
	}
111
}
112
113
func exit(err error) {
114
	panic(err)
115
	fmt.Fprintf(os.Stderr, "Error: %s\n", err)
116
	os.Exit(1)
32 117
}