# core/parsers/tool.clang-tidy.parser.ts

> 30 lines of code and 13 definitions.

Tree: GovLab Quality
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/quality#file-quality-core-parsers-tool-clang-tidy-parser-ts
Source text: https://banes-lab.com/source/quality/core/parsers/tool.clang-tidy.parser.ts.txt

Listed in [core/parsers](https://banes-lab.com/api/source/quality/core/parsers.md), after [core/parsers/tool.checkov.parser.ts](https://banes-lab.com/source/quality/core/parsers/tool.checkov.parser.ts.md) and before [core/parsers/tool.clippy.parser.ts](https://banes-lab.com/source/quality/core/parsers/tool.clippy.parser.ts.md).

## Definitions

- `parseLine` (lexical_declaration, line 23)
- `parseClangTidyOutput` (lexical_declaration, line 33, exported)
- `TOOL` (lexical_declaration, line 5)
- `DIAGNOSTIC_MARKERS` (lexical_declaration, line 6)
- `findMarker` (lexical_declaration, line 8)
- `extractCheck` (lexical_declaration, line 15)
- `open` (lexical_declaration, line 16)
- `close` (lexical_declaration, line 17)
- `ruleId` (lexical_declaration, line 18)
- `message` (lexical_declaration, line 19)
- `found` (lexical_declaration, line 24)
- `location` (lexical_declaration, line 25)
- `{ message, ruleId }` (lexical_declaration, line 29)

## Contained in

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

## Uses

- [core/factories/finding.factory.ts](https://banes-lab.com/source/quality/core/factories/finding.factory.ts.md)
- [core/parsers/location.parser.ts](https://banes-lab.com/source/quality/core/parsers/location.parser.ts.md)

## Linked from

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

## Source

```typescript
import { parseLines, parseLocation } from "#core/parsers/location.parser";
import type { Finding } from "#types/finding.types";
import { advisoryFinding } from "#core/factories/finding.factory";

const TOOL = "clang-tidy";
const DIAGNOSTIC_MARKERS = [": error: ", ": warning: "];

const findMarker = function findMarker(raw: string): { idx: number; marker: string } | null {
    const found = DIAGNOSTIC_MARKERS.map((marker) => ({ idx: raw.indexOf(marker), marker }))
        .filter((entry) => entry.idx !== -1)
        .toSorted((a, b) => a.idx - b.idx);
    return found[0] ?? null;
};

const extractCheck = function extractCheck(rest: string): { message: string; ruleId: string } {
    const open = rest.lastIndexOf("[");
    const close = rest.lastIndexOf("]");
    const ruleId = open !== -1 && close > open ? rest.slice(open + 1, close) : TOOL;
    const message = (open === -1 ? rest : rest.slice(0, open)).trim();
    return { message, ruleId };
};

const parseLine = function parseLine(raw: string, ecosystem: string): Finding | null {
    const found = findMarker(raw);
    const location = found === null ? null : parseLocation(raw.slice(0, found.idx));
    if (found === null || location === null) {
        return null;
    }
    const { message, ruleId } = extractCheck(raw.slice(found.idx + found.marker.length));
    return advisoryFinding({ ...location, ecosystem, message, ruleId, tool: TOOL });
};

export const parseClangTidyOutput = function parseClangTidyOutput(stdout: string, ecosystem: string): Finding[] {
    return parseLines(stdout, (line) => parseLine(line, ecosystem));
};
```
