# tools/core/runners/conduct.runner.ts

> 67 lines of code and 19 definitions.

Tree: Coordination tree
Language: typescript
Canonical: https://banes-lab.com/anatomy/coordination#file-coordination-tools-core-runners-conduct-runner-ts
Source text: https://banes-lab.com/assets/sources/source.996bbdbfd40607539af1a18c91d7196605632b4d26a47840a33f4f7a3285c962.generated.txt

## Definitions

- `isDeclaredHalf` (lexical_declaration, line 39, exported)
- `runHalf` (lexical_declaration, line 53, exported)
- `ROW` (lexical_declaration, line 8)
- `CELL` (lexical_declaration, line 10)
- `UNBUILT` (lexical_declaration, line 12)
- `ABSENT` (lexical_declaration, line 14)
- `HalfRequest` (interface_declaration, line 16, exported)
- `HalfOutcome` (interface_declaration, line 24, exported)
- `rowSlug` (lexical_declaration, line 29)
- `rest` (lexical_declaration, line 34)
- `close` (lexical_declaration, line 35)
- `withThirdCell` (lexical_declaration, line 43, exported)
- `cells` (lexical_declaration, line 44, exported)
- `absolute` (lexical_declaration, line 54, exported)
- `source` (lexical_declaration, line 63, exported)
- `lines` (lexical_declaration, line 64, exported)
- `at` (lexical_declaration, line 65, exported)
- `written` (lexical_declaration, line 71, exported)
- `outcome` (lexical_declaration, line 76, exported)

## Uses

- [tools/core/strings/conduct.strings.ts](https://banes-lab.com/source/coordination/tools/core/strings/conduct.strings.ts.md)

## Source

```typescript
import { existsSync, readFileSync } from "node:fs";
import { halfStated, rosterMissing, rowMalformed, rowMissing, undeclaredHalf } from "../strings/conduct.strings.ts";

import { FAILING_QUESTIONS } from "../constants/conduct.constants.ts";
import { resolve } from "node:path";
import { writeRepair } from "../writers/repair.writer.ts";

const ROW = "| `";

const CELL = "|";

const UNBUILT = "none";

const ABSENT = "—";

export interface HalfRequest {
    readonly repoRoot: string;
    readonly target: string;
    readonly slug: string;
    readonly value: string;
    readonly registered: readonly string[];
}

export interface HalfOutcome {
    readonly code: number;
    readonly message: string;
}

const rowSlug = function rowSlug(line: string): string {
    if (!line.startsWith(ROW)) {
        return "";
    }

    const rest = line.slice(ROW.length);
    const close = rest.indexOf("`");
    return close === -1 ? "" : rest.slice(0, close);
};

export const isDeclaredHalf = function isDeclaredHalf(value: string, registered: readonly string[]): boolean {
    return value === UNBUILT || value === ABSENT || FAILING_QUESTIONS.includes(value) || registered.includes(value);
};

export const withThirdCell = function withThirdCell(line: string, value: string): string | null {
    const cells = line.split(CELL);
    if (cells.length < 5) {
        return null;
    }

    cells[3] = ` \`${value}\` `;
    return cells.join(CELL);
};

export const runHalf = function runHalf(request: HalfRequest): HalfOutcome {
    const absolute = resolve(request.repoRoot, request.target);
    if (!existsSync(absolute)) {
        return { code: 2, message: rosterMissing(request.target) };
    }

    if (!isDeclaredHalf(request.value, request.registered)) {
        return { code: 2, message: undeclaredHalf(request.value, FAILING_QUESTIONS) };
    }

    const source = readFileSync(absolute, "utf8");
    const lines = source.split("\n");
    const at = lines.findIndex((line) => rowSlug(line) === request.slug);

    if (at === -1) {
        return { code: 2, message: rowMissing(request.slug, request.target) };
    }

    const written = withThirdCell(lines[at] ?? "", request.value);
    if (written === null) {
        return { code: 2, message: rowMalformed(request.slug) };
    }

    const outcome = writeRepair(
        { declared: "whole", repoRoot: request.repoRoot },
        request.target,
        [...lines.slice(0, at), written, ...lines.slice(at + 1)].join("\n"),
    );
    if (!outcome.written) {
        return { code: 2, message: outcome.refusal ?? "" };
    }

    return { code: 0, message: halfStated(request.slug, request.value) };
};
```
