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  }