54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								// For more tutorials: https://blog.learngoprogramming.com
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright © 2018 Inanc Gumus
							 | 
						||
| 
								 | 
							
								// Learn Go Programming Course
							 | 
						||
| 
								 | 
							
								// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								package main
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"strconv"
							 | 
						||
| 
								 | 
							
									"strings"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const fieldsLength = 4
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// result stores the parsed result for a domain
							 | 
						||
| 
								 | 
							
								type result struct {
							 | 
						||
| 
								 | 
							
									domain, page    string
							 | 
						||
| 
								 | 
							
									visits, uniques int
							 | 
						||
| 
								 | 
							
									// add more metrics if needed
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// parseResult from a log line
							 | 
						||
| 
								 | 
							
								func parseResult(line string) (r result, err error) {
							 | 
						||
| 
								 | 
							
									fields := strings.Fields(line)
							 | 
						||
| 
								 | 
							
									if len(fields) != fieldsLength {
							 | 
						||
| 
								 | 
							
										return r, fmt.Errorf("wrong input: %v", fields)
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									r.domain = fields[0]
							 | 
						||
| 
								 | 
							
									r.page = fields[1]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									r.visits, err = strconv.Atoi(fields[2])
							 | 
						||
| 
								 | 
							
									if err != nil || r.visits < 0 {
							 | 
						||
| 
								 | 
							
										return r, fmt.Errorf("wrong input: %q", fields[2])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									r.uniques, err = strconv.Atoi(fields[3])
							 | 
						||
| 
								 | 
							
									if err != nil || r.uniques < 0 {
							 | 
						||
| 
								 | 
							
										return r, fmt.Errorf("wrong input: %q", fields[3])
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return r, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// addResult to another one
							 | 
						||
| 
								 | 
							
								func addResult(r, other result) result {
							 | 
						||
| 
								 | 
							
									r.visits += other.visits
							 | 
						||
| 
								 | 
							
									r.uniques += other.uniques
							 | 
						||
| 
								 | 
							
									return r
							 | 
						||
| 
								 | 
							
								}
							 |