github.com/bgpat/reviewdog@v0.0.0-20230909064023-077e44ca1f66/parser/rdjson.go (about) 1 package parser 2 3 import ( 4 "fmt" 5 "io" 6 7 "google.golang.org/protobuf/encoding/protojson" 8 9 "github.com/bgpat/reviewdog/proto/rdf" 10 ) 11 12 var _ Parser = &RDJSONParser{} 13 14 // RDJSONParser is parser for rdjsonl format. 15 type RDJSONParser struct{} 16 17 // NewRDJSONParser returns a new RDJSONParser. 18 func NewRDJSONParser() *RDJSONParser { 19 return &RDJSONParser{} 20 } 21 22 // Parse parses rdjson (JSON of DiagnosticResult). 23 func (p *RDJSONParser) Parse(r io.Reader) ([]*rdf.Diagnostic, error) { 24 b, err := io.ReadAll(r) 25 if err != nil { 26 return nil, err 27 } 28 var dr rdf.DiagnosticResult 29 if err := protojson.Unmarshal(b, &dr); err != nil { 30 return nil, fmt.Errorf("failed to unmarshal rdjson (DiagnosticResult): %w", err) 31 } 32 for _, d := range dr.Diagnostics { 33 // Fill in default severity and source for each diagnostic. 34 if d.Severity == rdf.Severity_UNKNOWN_SEVERITY { 35 d.Severity = dr.GetSeverity() 36 } 37 if d.Source == nil { 38 d.Source = dr.Source 39 } 40 if d.GetOriginalOutput() == "" { 41 // TODO(haya14busa): Refactor not to fill in original output. 42 d.OriginalOutput = d.String() 43 } 44 } 45 return dr.Diagnostics, nil 46 }