1.3 KiB
1.3 KiB
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 fromparse()
- add
-
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()fromparse()
- return
-
remove:
p.lines++return r, fmt.Errorf("line %d: %v", p.lines, err)- remove:
lines int parse()andparse()becomes:
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
parseFieldsdirectly inparse():
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++ }
-