aboutsummaryrefslogtreecommitdiffstats
path: root/todolist/parser.go
diff options
context:
space:
mode:
authorQuey-Liang Kao <s101062801@m101.nthu.edu.tw>2017-08-29 17:00:18 +0800
committerQuey-Liang Kao <s101062801@m101.nthu.edu.tw>2017-08-29 17:00:18 +0800
commita716a04c831e4fb23cdd558756d8f393e4ef8d73 (patch)
treeb770c518314b8495f7e220ece9da4a10c6639546 /todolist/parser.go
parent34639c4285621177efb10b82ddb07cd0017af56a (diff)
Refactor previous commits
Rewrite the `ManipulateNotes` function into `HandleNotes`, which routes the note sub-commands to calls of newly-written `Parse*Note` functions. On successful parse, these functions return true, and false otherwise. Related tests are also refined.
Diffstat (limited to 'todolist/parser.go')
-rw-r--r--todolist/parser.go91
1 files changed, 50 insertions, 41 deletions
diff --git a/todolist/parser.go b/todolist/parser.go
index 8f5e180..6ad8007 100644
--- a/todolist/parser.go
+++ b/todolist/parser.go
@@ -83,57 +83,66 @@ func (p *Parser) Contexts(input string) []string {
return p.matchWords(input, r)
}
-func (p *Parser) ParseNotes(todo *Todo, input string) string {
- r, _ := regexp.Compile(`(\w+) \d+\s*(.*)?`)
+func (p *Parser) ParseAddNote(todo *Todo, input string) bool {
+ r, _ := regexp.Compile(`^an\s+\d+\s+(.*)`)
matches := r.FindStringSubmatch(input)
- switch matches[1] {
- case "an":
- todo.Notes = append(todo.Notes, matches[2])
- return "add"
+ if len(matches) != 2 {
+ return false
+ }
- case "n":
- groups := map[string][]*Todo{}
- groups[""] = append(groups[""], todo)
- formatter := NewFormatter(&GroupedTodos{Groups: groups})
- formatter.Print(true)
- return "list"
+ todo.Notes = append(todo.Notes, matches[1])
+ return true
+}
- case "dn":
- rmid, err := p.getNoteID(matches[2])
- if err != nil {
- return ""
- }
+func (p *Parser) ParseDeleteNote(todo *Todo, input string) bool {
+ r, _ := regexp.Compile(`^dn\s+\d+\s+(\d+)`)
+ matches := r.FindStringSubmatch(input)
+ if len(matches) != 2 {
+ return false
+ }
- for id, _ := range todo.Notes {
- if id == rmid {
- todo.Notes = append(todo.Notes[:rmid], todo.Notes[rmid+1:]...)
- return "delete"
- }
- }
- fmt.Println("Could not found note id")
- return ""
+ rmid, err := p.getNoteID(matches[1])
+ if err != nil {
+ return false
+ }
- case "en":
- r1, _ := regexp.Compile(`(\d)+\s+(.*)?`)
- tail := r1.FindStringSubmatch(matches[2])
- edid, err := p.getNoteID(tail[1])
- if err != nil {
- return ""
+ for id, _ := range todo.Notes {
+ if id == rmid {
+ todo.Notes = append(todo.Notes[:rmid], todo.Notes[rmid+1:]...)
+ return true
}
+ }
+ return false
+}
- for id, _ := range todo.Notes {
- if id == edid {
- todo.Notes[id] = tail[2]
- return "edit"
- }
- }
+func (p *Parser) ParseEditNote(todo *Todo, input string) bool {
+ r, _ := regexp.Compile(`^en\s+\d+\s+(\d+)\s+(.*)`)
+ matches := r.FindStringSubmatch(input)
+ if len(matches) != 3 {
+ return false
+ }
- fmt.Println("Could not found note id")
- return ""
+ edid, err := p.getNoteID(matches[1])
+ if err != nil {
+ return false
}
- fmt.Println("Could not match command or id")
- return ""
+ for id, _ := range todo.Notes {
+ if id == edid {
+ todo.Notes[id] = matches[2]
+ return true
+ }
+ }
+ return false
+}
+
+func (p *Parser) ParseShowNote(todo *Todo, input string) bool {
+ r, _ := regexp.Compile(`^n\s+\d+`)
+ matches := r.FindStringSubmatch(input)
+ if len(matches) != 1 {
+ return false
+ }
+ return true
}
func (p *Parser) getNoteID(input string) (int, error) {