forked from hjr265/lemon
/
parser.go
95 lines (76 loc) · 1.29 KB
/
parser.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
// Copyright 2014 Mahmud Ridwan. All rights reserved.
package lemon
import (
"strconv"
"strings"
)
type Parser interface {
Parse(string) error
Clear()
Count() int
String() string
}
type boolParser []bool
func (b *boolParser) Parse(s string) error {
t, err := strconv.ParseBool(s)
if err != nil {
return err
}
*b = append(*b, t)
return nil
}
func (b *boolParser) Clear() {
*b = []bool{}
}
func (b boolParser) Count() int {
return len(b)
}
func (b boolParser) String() string {
w := []byte{}
for i, t := range b {
if i > 0 {
w = append(w, ' ')
}
w = strconv.AppendBool(w, t)
}
return string(w)
}
type intParser []int
func (b *intParser) Parse(s string) error {
t, err := strconv.Atoi(s)
if err != nil {
return err
}
*b = append(*b, t)
return nil
}
func (b *intParser) Clear() {
*b = []int{}
}
func (b intParser) Count() int {
return len(b)
}
func (b intParser) String() string {
w := ""
for i, t := range b {
if i > 0 {
w += " "
}
w += strconv.Itoa(t)
}
return w
}
type stringParser []string
func (b *stringParser) Parse(s string) error {
*b = append(*b, s)
return nil
}
func (b *stringParser) Clear() {
*b = []string{}
}
func (b stringParser) Count() int {
return len(b)
}
func (b stringParser) String() string {
return strings.Join([]string(b), " ")
}