11package reporter
22
33import (
4+ "fmt"
45 "os"
56 "sync"
67 "text/template"
@@ -20,26 +21,32 @@ type MarkdownReportingConfig struct {
2021 Path string
2122}
2223
24+ type markdownTemplateInputRemediation struct {
25+ Pkg * models.Package
26+ PkgRemediationName string
27+ Score int
28+ }
29+
2330type markdownTemplateInput struct {
24- Manifests [] * models. PackageManifest
25- AnalyzerEvents [] * analyzer. AnalyzerEvent
26- PolicyEvents [] * policy. PolicyEvent
31+ Remediations [] markdownTemplateInputRemediation
32+ ManifestsCount int
33+ PackagesCount int
2734}
2835
36+ // Markdown reporter is built on top of summary reporter to
37+ // provide extended visibility
2938type markdownReportGenerator struct {
30- m sync.Mutex
31- config MarkdownReportingConfig
32- templateInput markdownTemplateInput
39+ m sync.Mutex
40+ config MarkdownReportingConfig
41+ summaryReporter Reporter
42+ templateInput markdownTemplateInput
3343}
3444
3545func NewMarkdownReportGenerator (config MarkdownReportingConfig ) (Reporter , error ) {
46+ summaryReporter , _ := NewSummaryReporter ()
3647 return & markdownReportGenerator {
37- config : config ,
38- templateInput : markdownTemplateInput {
39- Manifests : make ([]* models.PackageManifest , 0 ),
40- AnalyzerEvents : make ([]* analyzer.AnalyzerEvent , 0 ),
41- PolicyEvents : make ([]* policy.PolicyEvent , 0 ),
42- },
48+ config : config ,
49+ summaryReporter : summaryReporter ,
4350 }, nil
4451}
4552
@@ -48,26 +55,34 @@ func (r *markdownReportGenerator) Name() string {
4855}
4956
5057func (r * markdownReportGenerator ) AddManifest (manifest * models.PackageManifest ) {
51- r .m .Lock ()
52- defer r .m .Unlock ()
53- r .templateInput .Manifests = append (r .templateInput .Manifests , manifest )
58+ r .summaryReporter .AddManifest (manifest )
5459}
5560
56- func (r * markdownReportGenerator ) AddAnalyzerEvent (event * analyzer.AnalyzerEvent ) {
57- r .m .Lock ()
58- defer r .m .Unlock ()
59- r .templateInput .AnalyzerEvents = append (r .templateInput .AnalyzerEvents , event )
60- }
61+ func (r * markdownReportGenerator ) AddAnalyzerEvent (event * analyzer.AnalyzerEvent ) {}
6162
62- func (r * markdownReportGenerator ) AddPolicyEvent (event * policy.PolicyEvent ) {
63- r .m .Lock ()
64- defer r .m .Unlock ()
65- r .templateInput .PolicyEvents = append (r .templateInput .PolicyEvents , event )
66- }
63+ func (r * markdownReportGenerator ) AddPolicyEvent (event * policy.PolicyEvent ) {}
6764
6865func (r * markdownReportGenerator ) Finish () error {
6966 logger .Infof ("Generating consolidated markdown report: %s" , r .config .Path )
7067
68+ var sr * summaryReporter
69+ var ok bool
70+
71+ if sr , ok = r .summaryReporter .(* summaryReporter ); ! ok {
72+ return fmt .Errorf ("failed to duck type Reporter to summaryReporter" )
73+ }
74+
75+ sortedList := sr .sortedRemediations ()
76+ remediations := []markdownTemplateInputRemediation {}
77+
78+ for _ , s := range sortedList {
79+ remediations = append (remediations , markdownTemplateInputRemediation {
80+ Pkg : s .pkg ,
81+ PkgRemediationName : sr .packageNameForRemediationAdvice (s .pkg ),
82+ Score : s .score ,
83+ })
84+ }
85+
7186 tmpl , err := template .New ("markdown" ).Parse (markdownTemplate )
7287 if err != nil {
7388 return err
@@ -79,5 +94,9 @@ func (r *markdownReportGenerator) Finish() error {
7994 }
8095
8196 defer file .Close ()
82- return tmpl .Execute (file , r .templateInput )
97+ return tmpl .Execute (file , markdownTemplateInput {
98+ Remediations : remediations ,
99+ ManifestsCount : sr .summary .manifests ,
100+ PackagesCount : sr .summary .packages ,
101+ })
83102}
0 commit comments