printReport method
int
printReport(
- List<
AuditRunResult> results, { - required ProjectContext context,
- bool verbose = false,
- Severity? failOn = Severity.high,
Prints the full report and returns the process exit code: 0 if no
issue meets failOn, 1 otherwise. Maintenance findings never affect
the exit code. Pass failOn: null to always exit 0.
Implementation
int printReport(
List<AuditRunResult> results, {
required ProjectContext context,
bool verbose = false,
Severity? failOn = Severity.high,
}) {
final securityIssues = <SecurityIssue>[];
final maintenanceIssues = <SecurityIssue>[];
final passedAudits = <Audit>[];
for (final run in results) {
if (!run.result.hasIssues) {
passedAudits.add(run.audit);
continue;
}
if (maintenanceAuditIds.contains(run.audit.id)) {
maintenanceIssues.addAll(run.result.issues);
} else {
securityIssues.addAll(run.result.issues);
}
}
final highRisk = securityIssues
.where(
(issue) =>
issue.severity == Severity.critical ||
issue.severity == Severity.high,
)
.toList();
final mediumRisk = securityIssues
.where((issue) => issue.severity == Severity.medium)
.toList();
final lowRisk = securityIssues
.where(
(issue) =>
issue.severity == Severity.low || issue.severity == Severity.info,
)
.toList();
_printHeader(context);
_printSummary(
highRisk,
mediumRisk,
lowRisk,
maintenanceIssues,
passedAudits,
);
var itemNumber = 1;
itemNumber = _printRiskSection('HIGH RISK', '✗', highRisk, itemNumber);
itemNumber = _printRiskSection('MEDIUM RISK', '⚠', mediumRisk, itemNumber);
_printLowRiskSection(lowRisk, verbose: verbose);
_printMaintenanceSection(maintenanceIssues, verbose: verbose);
_printPassedSection(passedAudits);
final hasFailingIssue =
failOn != null &&
securityIssues.any(
(issue) => issue.severity.isAtLeastAsSevereAs(failOn),
);
final exitCode = hasFailingIssue ? 1 : 0;
_printFooter(
highRisk.length,
mediumRisk.length,
lowRisk.length,
maintenanceIssues.length,
exitCode,
);
return exitCode;
}