refactor: logparser v6

This commit is contained in:
Inanc Gumus
2019-08-31 12:38:50 +03:00
parent b5fbf7d10a
commit 81bd060e1b
15 changed files with 261 additions and 232 deletions

View File

@@ -0,0 +1,40 @@
// 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 parse
import "fmt"
// Count the parsed records.
type Count struct {
// Parser is wrapped by Count to count the parsed records.
Parser
count int
}
// CountRecords creates a record counter that wraps a parser.
func CountRecords(p Parser) *Count {
return &Count{Parser: p}
}
// Parse increments the counter.
func (c *Count) Parse() bool {
c.count++
return c.Parser.Parse()
}
// Err returns the first error that was encountered by the Log.
func (c *Count) Err() (err error) {
err = c.Parser.Err()
if err != nil {
err = fmt.Errorf("record #%d: %v", c.count, err)
}
return
}
// You don't need to implement the Value() method.
// Thanks to interface embedding.

View File

@@ -0,0 +1,58 @@
// For more tutorials: https://bj.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package parse
import (
"encoding/json"
"io"
"github.com/inancgumus/learngo/logparser/v6/logly/record"
)
// JSONParser parses json records.
type JSONParser struct {
in *json.Decoder
err error // last error
last *record.Record // last parsed record
}
// JSON creates a json parser.
func JSON(r io.Reader) *JSONParser {
return &JSONParser{
in: json.NewDecoder(r),
last: new(record.Record),
}
}
// Parse the next line.
func (p *JSONParser) Parse() bool {
if p.err != nil {
return false
}
p.last.Reset()
err := p.in.Decode(&p.last)
if err == io.EOF {
return false
}
p.err = err
return err == nil
}
// Value returns the most recent record parsed by a call to Parse.
func (p *JSONParser) Value() record.Record {
return *p.last
}
// Err returns the first error that was encountered by the Log.
func (p *JSONParser) Err() error {
return p.err
}

View File

@@ -0,0 +1,22 @@
// 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 parse
import "github.com/inancgumus/learngo/logparser/v6/logly/record"
// Parser is an interface for the parsers.
type Parser interface {
// Parse the next record from the source.
Parse() bool
// Value returns the last parsed record by a call to Parse.
Value() record.Record
// Err returns the first error that was encountered.
Err() error
}

View File

@@ -0,0 +1,54 @@
// For more tutorials: https://bp.learngoprogramming.com
//
// Copyright © 2018 Inanc Gumus
// Learn Go Programming Course
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
//
package parse
import (
"bufio"
"io"
"github.com/inancgumus/learngo/logparser/v6/logly/record"
)
// TextParser parses text based log lines.
type TextParser struct {
in *bufio.Scanner
err error // last error
last *record.Record // last parsed record
}
// Text creates a text parser.
func Text(r io.Reader) *TextParser {
return &TextParser{
in: bufio.NewScanner(r),
last: new(record.Record),
}
}
// Parse the next line.
func (p *TextParser) Parse() bool {
if p.err != nil {
return false
}
if !p.in.Scan() {
return false
}
p.err = p.last.FromText(p.in.Bytes())
return true
}
// Value returns the most recent record parsed by a call to Parse.
func (p *TextParser) Value() record.Record {
return *p.last
}
// Err returns the first error that was encountered by the Log.
func (p *TextParser) Err() error {
return p.err
}