printReport method

int printReport(
  1. List<AuditRunResult> results, {
  2. required ProjectContext context,
  3. bool verbose = false,
  4. 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;
}