-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.go
88 lines (70 loc) · 1.2 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
package stats
import (
"bufio"
"fmt"
"io"
"strings"
)
type statsParser struct {
lastErr error
item statItem
scanner *bufio.Scanner
}
func newStatsParser(scanner *bufio.Scanner) *statsParser {
return &statsParser{
scanner: scanner,
}
}
// Error ...
type Error struct {
Msg string
}
func (e *Error) Error() string {
return fmt.Sprint("stats: ", e.Msg)
}
// NewError ...
func NewError(msg string) *Error {
return &Error{
Msg: msg,
}
}
func (p *statsParser) next() bool {
ok := p.scanner.Scan()
p.lastErr = p.scanner.Err()
if p.lastErr != nil {
return false
}
if !ok {
p.lastErr = io.EOF
return false
}
line := p.scanner.Text()
fields := strings.Fields(line)
if len(fields) == 0 {
p.lastErr = NewError("empty line")
return false
}
if fields[0] == "END" {
p.item = statItem{}
return false
}
if fields[0] != "STAT" {
p.lastErr = NewError("line not begin with STAT")
return false
}
if len(fields) < 3 {
p.lastErr = NewError("missing stat fields")
return false
}
p.item = statItem{
key: fields[1],
value: fields[2],
}
return true
}
func (p *statsParser) getError() error {
return p.lastErr
}
func (p *statsParser) getItem() statItem {
return p.item
}