parser/gotest: Create interface for reading lines with metadata

This commit is contained in:
Joël Stemmer 2022-08-11 23:48:41 +01:00
parent 27ad87e370
commit f6f9df42b9
3 changed files with 22 additions and 10 deletions

View File

@ -133,10 +133,10 @@ func (p *Parser) Parse(r io.Reader) (gtr.Report, error) {
return p.parse(reader.NewLimitedLineReader(r, maxLineSize)) return p.parse(reader.NewLimitedLineReader(r, maxLineSize))
} }
func (p *Parser) parse(r *reader.LimitedLineReader) (gtr.Report, error) { func (p *Parser) parse(r reader.LineReader) (gtr.Report, error) {
p.events = nil p.events = nil
for { for {
line, err := r.ReadLine() line, _, err := r.ReadLine()
if err == io.EOF { if err == io.EOF {
break break
} else if err != nil { } else if err != nil {

View File

@ -6,6 +6,16 @@ import (
"io" "io"
) )
// LineReader is an interface to read lines with optional Metadata.
type LineReader interface {
ReadLine() (string, *Metadata, error)
}
// Metadata contains metadata that belongs to a line.
type Metadata struct {
Package string
}
// LimitedLineReader reads lines from an io.Reader object with a configurable // LimitedLineReader reads lines from an io.Reader object with a configurable
// line size limit. Lines exceeding the limit will be truncated, but read // line size limit. Lines exceeding the limit will be truncated, but read
// completely from the underlying io.Reader. // completely from the underlying io.Reader.
@ -14,6 +24,8 @@ type LimitedLineReader struct {
limit int limit int
} }
var _ LineReader = &LimitedLineReader{}
// NewLimitedLineReader returns a LimitedLineReader to read lines from r with a // NewLimitedLineReader returns a LimitedLineReader to read lines from r with a
// maximum line size of limit. // maximum line size of limit.
func NewLimitedLineReader(r io.Reader, limit int) *LimitedLineReader { func NewLimitedLineReader(r io.Reader, limit int) *LimitedLineReader {
@ -23,14 +35,14 @@ func NewLimitedLineReader(r io.Reader, limit int) *LimitedLineReader {
// ReadLine returns the next line from the underlying reader. The length of the // ReadLine returns the next line from the underlying reader. The length of the
// line will not exceed the configured limit. ReadLine either returns a line or // line will not exceed the configured limit. ReadLine either returns a line or
// it returns an error, never both. // it returns an error, never both.
func (r *LimitedLineReader) ReadLine() (string, error) { func (r *LimitedLineReader) ReadLine() (string, *Metadata, error) {
line, isPrefix, err := r.r.ReadLine() line, isPrefix, err := r.r.ReadLine()
if err != nil { if err != nil {
return "", err return "", nil, err
} }
if !isPrefix { if !isPrefix {
return string(line), nil return string(line), nil, nil
} }
// Line is incomplete, keep reading until we reach the end of the line. // Line is incomplete, keep reading until we reach the end of the line.
@ -39,7 +51,7 @@ func (r *LimitedLineReader) ReadLine() (string, error) {
for isPrefix { for isPrefix {
line, isPrefix, err = r.r.ReadLine() line, isPrefix, err = r.r.ReadLine()
if err != nil { if err != nil {
return "", err return "", nil, err
} }
if buf.Len() >= r.limit { if buf.Len() >= r.limit {
@ -54,5 +66,5 @@ func (r *LimitedLineReader) ReadLine() (string, error) {
if buf.Len() > r.limit { if buf.Len() > r.limit {
buf.Truncate(r.limit) buf.Truncate(r.limit)
} }
return buf.String(), nil return buf.String(), nil, nil
} }

View File

@ -34,7 +34,7 @@ func TestLimitedLineReader(t *testing.T) {
input := strings.NewReader(strings.Join([]string{line1, line2}, "\n")) input := strings.NewReader(strings.Join([]string{line1, line2}, "\n"))
r := NewLimitedLineReader(input, testingLimit) r := NewLimitedLineReader(input, testingLimit)
got, err := r.ReadLine() got, _, err := r.ReadLine()
if err != nil { if err != nil {
t.Fatalf("ReadLine() returned error %v", err) t.Fatalf("ReadLine() returned error %v", err)
} }
@ -47,7 +47,7 @@ func TestLimitedLineReader(t *testing.T) {
t.Fatalf("ReadLine() returned incorrect line, got len %d want len %d", len(got), len(want)) t.Fatalf("ReadLine() returned incorrect line, got len %d want len %d", len(got), len(want))
} }
got, err = r.ReadLine() got, _, err = r.ReadLine()
if err != nil { if err != nil {
t.Fatalf("ReadLine() returned error %v", err) t.Fatalf("ReadLine() returned error %v", err)
} }
@ -56,7 +56,7 @@ func TestLimitedLineReader(t *testing.T) {
t.Fatalf("ReadLine() returned incorrect line, got len %d want len %d", len(got), len(want)) t.Fatalf("ReadLine() returned incorrect line, got len %d want len %d", len(got), len(want))
} }
got, err = r.ReadLine() got, _, err = r.ReadLine()
if err != io.EOF { if err != io.EOF {
t.Fatalf("ReadLine() returned unexpected error, got %v want %v\n", err, io.EOF) t.Fatalf("ReadLine() returned unexpected error, got %v want %v\n", err, io.EOF)
} }