aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/covermerger
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2024-08-14 16:33:54 +0200
committerTaras Madan <tarasmadan@google.com>2024-08-16 09:17:58 +0000
commitf13a072362423321c5643f0a95caae95964726d4 (patch)
tree031bfa842a8ef369a17c89f76c0676ac46f12612 /pkg/covermerger
parent2a55e7869e9d5b27438a7494a42ce7dc93a16cc1 (diff)
pkg/covermerger: stop panic, do errors
Diffstat (limited to 'pkg/covermerger')
-rw-r--r--pkg/covermerger/covermerger.go42
1 files changed, 26 insertions, 16 deletions
diff --git a/pkg/covermerger/covermerger.go b/pkg/covermerger/covermerger.go
index 4c9bdfd8b..5c3e021a6 100644
--- a/pkg/covermerger/covermerger.go
+++ b/pkg/covermerger/covermerger.go
@@ -6,6 +6,7 @@ package covermerger
import (
"context"
"encoding/csv"
+ "errors"
"fmt"
"io"
"strconv"
@@ -67,13 +68,14 @@ func batchFileData(c *Config, targetFilePath string, records []*FileRecord) (*Me
return merger.Result(), nil
}
-func makeRecord(fields, schema []string) *FileRecord {
+func makeRecord(fields, schema []string) (*FileRecord, error) {
if len(fields) != len(schema) {
- panic("fields size and schema size are not equal")
+ return nil, errors.New("fields size and schema size are not equal")
}
record := &FileRecord{}
for i, val := range fields {
key := schema[i]
+ var err error
switch key {
case KeyFilePath:
record.FilePath = val
@@ -84,20 +86,23 @@ func makeRecord(fields, schema []string) *FileRecord {
case KeyKernelCommit:
record.Commit = val
case KeyStartLine:
- record.StartLine = readIntField(key, val)
+ record.StartLine, err = readIntField(key, val)
case KeyHitCount:
- record.HitCount = readIntField(key, val)
+ record.HitCount, err = readIntField(key, val)
+ }
+ if err != nil {
+ return nil, err
}
}
- return record
+ return record, nil
}
-func readIntField(field, val string) int {
+func readIntField(field, val string) (int, error) {
res, err := strconv.Atoi(val)
if err != nil {
- panic(fmt.Errorf("failed to Atoi(%s) %s: %w", val, field, err))
+ return -1, fmt.Errorf("failed to Atoi(%s) %s: %w", val, field, err)
}
- return res
+ return res, nil
}
type Config struct {
@@ -128,7 +133,7 @@ func MergeCSVData(config *Config, reader io.Reader) (map[string]*MergeResult, er
} else {
schema = fields
}
- errStdinReadChan := make(chan error, 1)
+ errStreamChan := make(chan error, 1)
recordsChan := make(chan *FileRecord)
go func() {
defer close(recordsChan)
@@ -138,22 +143,27 @@ func MergeCSVData(config *Config, reader io.Reader) (map[string]*MergeResult, er
break
}
if err != nil {
- errStdinReadChan <- fmt.Errorf("failed to read CSV line: %w", err)
+ errStreamChan <- fmt.Errorf("failed to read CSV line: %w", err)
return
}
if isSchema(fields, schema) {
// The input may be the merged CVS files with multiple schemas.
continue
}
- recordsChan <- makeRecord(fields, schema)
+ record, err := makeRecord(fields, schema)
+ if err != nil {
+ errStreamChan <- fmt.Errorf("makeRecord: %w", err)
+ return
+ }
+ recordsChan <- record
}
- errStdinReadChan <- nil
+ errStreamChan <- nil
}()
mergeResult, errMerging := mergeChanData(config, recordsChan)
- errStdinRead := <-errStdinReadChan
- if errMerging != nil || errStdinRead != nil {
- return nil, fmt.Errorf("errors merging stdin data:\nmerger err: %w\nstdin reader err: %w",
- errMerging, errStdinRead)
+ errStream := <-errStreamChan
+ if errMerging != nil || errStream != nil {
+ return nil, fmt.Errorf("errors merging stream data:\nmerger err: %w\nstream reader err: %w",
+ errMerging, errStream)
}
return mergeResult, nil
}