# core/matchers/architecture.matcher.ts

> 26 lines of code and 5 definitions.

Tree: GovLab Context
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/context#file-context-core-matchers-architecture-matcher-ts
Source text: https://banes-lab.com/source/context/core/matchers/architecture.matcher.ts.txt

Listed in [core/matchers](https://banes-lab.com/api/source/context/core/matchers.md), after [core/matchers/algorithm.matcher.ts](https://banes-lab.com/source/context/core/matchers/algorithm.matcher.ts.md) and before [core/matchers/filename.matcher.ts](https://banes-lab.com/source/context/core/matchers/filename.matcher.ts.md).

## Definitions

- `isWanted` (lexical_declaration, line 3)
- `matchesScalars` (lexical_declaration, line 7)
- `matchesLists` (lexical_declaration, line 16)
- `matchesPrinciple` (lexical_declaration, line 28, exported)
- `checks` (lexical_declaration, line 17)

## Contained in

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

## Linked from

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

## Source

```typescript
import type { Principle, PrincipleFilter } from "#types/architecture.types";

const isWanted = function isWanted(value: string | undefined): value is string {
    return typeof value === "string" && value.length > 0;
};

const matchesScalars = function matchesScalars(principle: Principle, filter: PrincipleFilter): boolean {
    const checks: [string | undefined, string][] = [
        [filter.type, principle.type],
        [filter.category, principle.category],
        [filter.severity, principle.severity],
    ];
    return checks.every(([value, actual]) => !isWanted(value) || actual === value);
};

const matchesLists = function matchesLists(principle: Principle, filter: PrincipleFilter): boolean {
    const checks: [string | undefined, string[]][] = [
        [filter.scope, principle.scope],
        [filter.enables, principle.enables],
        [filter.requires, principle.requires],
        [filter.reinforces, principle.reinforces],
        [filter.conflictsWith, principle.conflicts_with],
        [filter.tensionsWith, principle.tensions_with],
    ];
    return checks.every(([value, list]) => !isWanted(value) || list.includes(value));
};

export const matchesPrinciple = function matchesPrinciple(principle: Principle, filter: PrincipleFilter): boolean {
    return matchesScalars(principle, filter) && matchesLists(principle, filter);
};
```
