auditAcks function

List<AckAudit> auditAcks(
  1. CheckResult result,
  2. DialectProject project,
  3. StateStore state
)

Classify every entry in state against project, using the raw (pre-suppression) result to tell a live ack from an inert one.

Sorted by id, so the output is stable in a diff.

Implementation

List<AckAudit> auditAcks(
  CheckResult result,
  DialectProject project,
  StateStore state,
) {
  final fired = <String>{};
  for (final issue in result.issues) {
    final id = ackId(issue);
    if (id != null) fired.add(id);
  }

  final audits = <AckAudit>[];
  for (final entry in state.checks.entries) {
    final id = entry.key;
    final parts = id.split(':');
    if (parts.length != 3 ||
        parts.any((p) => p.isEmpty) ||
        !isAckableRule(parts[0])) {
      audits.add(
        AckAudit(id: id, status: AckStatus.invalid, record: entry.value),
      );
      continue;
    }
    final locale = parts[1] == 'source' ? null : parts[1];
    final current = ackFingerprint(parts[0], locale, parts[2], project);
    final AckStatus status;
    if (current == null) {
      status = AckStatus.orphaned;
    } else if (current != entry.value.acknowledged) {
      status = AckStatus.lapsed;
    } else if (fired.contains(id)) {
      status = AckStatus.live;
    } else {
      status = AckStatus.inert;
    }
    audits.add(AckAudit(id: id, status: status, record: entry.value));
  }

  audits.sort((a, b) => a.id.compareTo(b.id));
  return audits;
}