core/parsers/invariant.parser.ts

core/parsers/invariant.parser.ts is a file in GovLab Context. 37 lines of code and 11 definitions.

import {
    INVARIANT_OBJECTOR,
    INVARIANT_PARTIES,
    INVARIANT_PREFIX,
    INVARIANT_SET,
} from "#configuration/constants/grammar.constants";
import type { PagInvariant } from "#types/grammar.document.types";

const CLAUSE_MARKERS = [INVARIANT_SET, INVARIANT_PARTIES, INVARIANT_OBJECTOR];
const NAME_END = ":";

const clauseOf = function clauseOf(text: string, marker: string): string | null {
    const at = text.indexOf(marker);
    if (at === -1) {
        return null;
    }
    const start = at + marker.length;
    const ends = CLAUSE_MARKERS.map((other) => (other === marker ? -1 : text.indexOf(other, start))).filter(
        (index) => index !== -1,
    );
    return text.slice(start, ends.length === 0 ? text.length : Math.min(...ends)).trim();
};

const propertyOf = function propertyOf(afterName: string): string {
    const ends = CLAUSE_MARKERS.map((marker) => afterName.indexOf(marker)).filter((index) => index !== -1);
    return (ends.length === 0 ? afterName : afterName.slice(0, Math.min(...ends))).trim();
};

export const parseInvariant = function parseInvariant(text: string, line: number): PagInvariant {
    const body = text.slice(INVARIANT_PREFIX.length);
    const colon = body.indexOf(NAME_END);
    const afterName = colon === -1 ? "" : body.slice(colon + 1);
    return {
        line,
        name: (colon === -1 ? body : body.slice(0, colon)).trim(),
        objector: clauseOf(afterName, INVARIANT_OBJECTOR),
        parties: clauseOf(afterName, INVARIANT_PARTIES),
        property: propertyOf(afterName),
        set: clauseOf(afterName, INVARIANT_SET),
    };
};