go.mondoo.com/cnquery@v0.0.0-20231005093811-59568235f6ea/explorer/scan/reporter.go (about) 1 // Copyright (c) Mondoo, Inc. 2 // SPDX-License-Identifier: BUSL-1.1 3 4 package scan 5 6 import ( 7 "go.mondoo.com/cnquery/explorer" 8 "go.mondoo.com/cnquery/providers-sdk/v1/inventory" 9 "go.mondoo.com/cnquery/utils/multierr" 10 ) 11 12 type Reporter interface { 13 AddReport(asset *inventory.Asset, results *AssetReport) 14 AddScanError(asset *inventory.Asset, err error) 15 } 16 17 type AssetReport struct { 18 Mrn string 19 Bundle *explorer.Bundle 20 Report *explorer.Report 21 Resolved *explorer.ResolvedPack 22 } 23 24 type AggregateReporter struct { 25 assets map[string]*explorer.Asset 26 assetReports map[string]*explorer.Report 27 assetErrors map[string]error 28 bundle *explorer.Bundle 29 resolved map[string]*explorer.ResolvedPack 30 } 31 32 func NewAggregateReporter(assetList []*inventory.Asset) *AggregateReporter { 33 assets := make(map[string]*explorer.Asset, len(assetList)) 34 for i := range assetList { 35 cur := assetList[i] 36 assets[cur.Mrn] = &explorer.Asset{ 37 Mrn: cur.Mrn, 38 Name: cur.Name, 39 } 40 } 41 42 return &AggregateReporter{ 43 assets: assets, 44 assetReports: map[string]*explorer.Report{}, 45 assetErrors: map[string]error{}, 46 resolved: map[string]*explorer.ResolvedPack{}, 47 } 48 } 49 50 func (r *AggregateReporter) AddReport(asset *inventory.Asset, results *AssetReport) { 51 r.assetReports[asset.Mrn] = results.Report 52 r.resolved[asset.Mrn] = results.Resolved 53 r.bundle = results.Bundle 54 } 55 56 func (r *AggregateReporter) AddScanError(asset *inventory.Asset, err error) { 57 r.assetErrors[asset.Mrn] = err 58 } 59 60 func (r *AggregateReporter) Reports() *explorer.ReportCollection { 61 errors := make(map[string]*explorer.ErrorStatus, len(r.assetErrors)) 62 for k, v := range r.assetErrors { 63 errors[k] = explorer.NewErrorStatus(v) 64 } 65 66 return &explorer.ReportCollection{ 67 Assets: r.assets, 68 Reports: r.assetReports, 69 Errors: errors, 70 Bundle: r.bundle, 71 Resolved: r.resolved, 72 } 73 } 74 75 func (r *AggregateReporter) Error() error { 76 var err multierr.Errors 77 for _, curError := range r.assetErrors { 78 err.Add(curError) 79 } 80 return err.Deduplicate() 81 }