61 lines
1.3 KiB
Markdown
61 lines
1.3 KiB
Markdown
![]() |
### PROBLEM
|
||
|
+ `main.go` (api client) does a lot of things:
|
||
|
+ read the log input
|
||
|
+ parse line by line
|
||
|
+ updates the results
|
||
|
+ display the results
|
||
|
|
||
|
+ inflexible:
|
||
|
+ filter by extension (can change)
|
||
|
+ group by domain (can change) — group by page?
|
||
|
|
||
|
## SOLUTION
|
||
|
+ hide the parsing api from the client
|
||
|
|
||
|
+ move `main.go/scanner` -> `parser.go/parse()`
|
||
|
+ add `main.go`: err handling from `parse()`
|
||
|
|
||
|
+ `parser.go/parse()` -> return err directly
|
||
|
+ remove: `if p.lerr != nil { return }` from parse() and update()
|
||
|
+ remove: `dumpErrs`
|
||
|
+ remove: `parser.go/err()`
|
||
|
+ remove `parser.go/lerr`
|
||
|
+ return `in.Err()` from `parse()`
|
||
|
|
||
|
+ remove: `p.lines++`
|
||
|
+ `return r, fmt.Errorf("line %d: %v", p.lines, err)`
|
||
|
+ remove: `lines int`
|
||
|
+ `parse()` and `parse()` becomes:
|
||
|
```golang
|
||
|
func parse(p *parser, line string) (result, error) {
|
||
|
return parseFields(line)
|
||
|
}
|
||
|
|
||
|
func parse(p *parser) {
|
||
|
// ...
|
||
|
r, err := parse(p, in.Text())
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("line %d: %v", p.lines, err)
|
||
|
}
|
||
|
// ...
|
||
|
}
|
||
|
```
|
||
|
|
||
|
+ remove `parse()`
|
||
|
+ call `parseFields` directly in `parse()`:
|
||
|
```go
|
||
|
var (
|
||
|
l = 1
|
||
|
in = bufio.NewScanner(os.Stdin)
|
||
|
)
|
||
|
|
||
|
for in.Scan() {
|
||
|
r, err := parseFields(in.Text())
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("line %d: %v", l, err)
|
||
|
}
|
||
|
|
||
|
update(p, r)
|
||
|
l++
|
||
|
}
|
||
|
```
|