Files
learngo/interfaces/05-log-parser/refactor-notes/refactor-01/changes.md
2019-08-19 10:21:17 +03:00

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 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:
      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():
      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++
      }