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++ | ||
|  |     } | ||
|  |     ``` |