# core/formatters/validation.formatter.ts

> 21 lines of code and 4 definitions.

Tree: GovLab Quality
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-formatters-validation-formatter-ts
Source text: https://banes-lab.com/source/quality/core/formatters/validation.formatter.ts.txt

Listed in [core/formatters](https://banes-lab.com/api/source/quality/core/formatters.md), after [core/formatters/stylelint.formatter.ts](https://banes-lab.com/source/quality/core/formatters/stylelint.formatter.ts.md).

## Definitions

- `renderPanel` (lexical_declaration, line 20, exported)
- `locationOf` (lexical_declaration, line 10)
- `renderFinding` (lexical_declaration, line 14)
- `action` (lexical_declaration, line 15)

## Contained in

- [core/formatters](https://banes-lab.com/anatomy/quality/folder-quality-core-formatters.md)

## Uses

- [configuration/strings/validation.strings.ts](https://banes-lab.com/source/quality/configuration/strings/validation.strings.ts.md)

## Used by

- [core/coordinators/validation.coordinator.ts](https://banes-lab.com/source/quality/core/coordinators/validation.coordinator.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/quality/folder-quality-configuration-strings.md)
- [core/coordinators](https://banes-lab.com/anatomy/quality/folder-quality-core-coordinators.md)
- [core/formatters](https://banes-lab.com/anatomy/quality/folder-quality-core-formatters.md)

## Source

```typescript
import {
    CLEAN_PANEL,
    blockedPanel,
    findingAction,
    findingHead,
    findingMessage,
} from "#configuration/strings/validation.strings";
import type { Finding } from "#types/finding.types";

const locationOf = function locationOf(finding: Finding): string {
    return finding.line > 0 ? `${finding.file}:${String(finding.line)}:${String(finding.column)}` : finding.file;
};

const renderFinding = function renderFinding(finding: Finding): string[] {
    const action =
        finding.suggestion === undefined || finding.suggestion === "" ? [] : [findingAction(finding.suggestion)];
    return [findingHead(locationOf(finding), finding.ruleId), findingMessage(finding.message), ...action];
};

export const renderPanel = function renderPanel(findings: readonly Finding[]): string {
    return findings.length === 0
        ? CLEAN_PANEL
        : [blockedPanel(findings.length), "", ...findings.flatMap(renderFinding)].join("\n");
};
```
