# core/classifiers/syntax.classifier.ts

> 24 lines of code and 10 definitions.

Tree: GovLab Patterns
Language: typescript
Layer: application
Canonical: https://banes-lab.com/anatomy/patterns#file-patterns-core-classifiers-syntax-classifier-ts
Source text: https://banes-lab.com/source/patterns/core/classifiers/syntax.classifier.ts.txt

Listed in [core/classifiers](https://banes-lab.com/api/source/patterns/core/classifiers.md), after [core/classifiers/schema.classifier.ts](https://banes-lab.com/source/patterns/core/classifiers/schema.classifier.ts.md).

## Definitions

- `stateOf` (lexical_declaration, line 26, exported)
- `matches` (lexical_declaration, line 11)
- `roleOf` (lexical_declaration, line 15, exported)
- `CALL_TOKENS` (lexical_declaration, line 3)
- `DEFINITION_TOKENS` (lexical_declaration, line 4)
- `CONTAINER_SUFFIX` (lexical_declaration, line 5)
- `ROLE_CALL` (lexical_declaration, line 7, exported)
- `ROLE_DEFINITION` (lexical_declaration, line 8, exported)
- `ROLE_NODE` (lexical_declaration, line 9, exported)
- `lower` (lexical_declaration, line 27, exported)

## Contained in

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

## Used by

- [core/coordinators/page.coordinator.ts](https://banes-lab.com/source/patterns/core/coordinators/page.coordinator.ts.md)
- [core/loaders/source.loader.ts](https://banes-lab.com/source/patterns/core/loaders/source.loader.ts.md)
- [core/resolvers/walk.resolver.ts](https://banes-lab.com/source/patterns/core/resolvers/walk.resolver.ts.md)

## Linked from

- [core/classifiers](https://banes-lab.com/anatomy/patterns/folder-patterns-core-classifiers.md)
- [core/coordinators](https://banes-lab.com/anatomy/patterns/folder-patterns-core-coordinators.md)
- [core/loaders](https://banes-lab.com/anatomy/patterns/folder-patterns-core-loaders.md)
- [core/resolvers](https://banes-lab.com/anatomy/patterns/folder-patterns-core-resolvers.md)

## Source

```typescript
import { STATE_RULES, STATE_STRUCT } from "#configuration/constants/walk.constants";

const CALL_TOKENS: readonly string[] = ["call", "invocation"];
const DEFINITION_TOKENS: readonly string[] = ["definition", "declaration"];
const CONTAINER_SUFFIX = "_list";

export const ROLE_CALL = "call";
export const ROLE_DEFINITION = "definition";
export const ROLE_NODE = "node";

const matches = function matches(haystack: string, needles: readonly string[]): boolean {
    return needles.some((needle) => haystack.includes(needle));
};

export const roleOf = function roleOf(nodeType: string): string {
    const lower = nodeType.toLowerCase();
    if (matches(lower, CALL_TOKENS)) {
        return ROLE_CALL;
    }
    if (lower.endsWith(CONTAINER_SUFFIX)) {
        return ROLE_NODE;
    }
    return matches(lower, DEFINITION_TOKENS) ? ROLE_DEFINITION : ROLE_NODE;
};

export const stateOf = function stateOf(label: string): string {
    const lower = label.toLowerCase();
    return STATE_RULES.find((rule) => matches(lower, rule.tokens))?.state ?? STATE_STRUCT;
};
```
