tools/core/readers/json.reader.ts

tools/core/readers/json.reader.ts is a file in Coordination Surface. 42 lines of code and 7 definitions.

import { unreadableJson, unsatisfiedShape } from "../strings/json.strings.ts";

export const parseJson = function parseJson(text: string, origin: string): unknown {
    try {
        return JSON.parse(text);
    } catch (error) {
        const detail = error instanceof Error ? error.message : String(error);
        throw new Error(unreadableJson(origin, detail), { cause: error });
    }
};

export const tryParse = function tryParse(text: string): { readonly value: unknown } | null {
    try {
        const value: unknown = JSON.parse(text);
        return { value };
    } catch (error) {
        if (error instanceof SyntaxError) {
            return null;
        }
        throw error;
    }
};

export const fieldOf = function fieldOf(value: object, key: string): unknown {
    return Object.getOwnPropertyDescriptor(value, key)?.value;
};

export const narrow = function narrow<T>(
    value: unknown,
    guard: (candidate: unknown) => candidate is T,
    origin: string,
    shape: string,
): T {
    if (!guard(value)) {
        throw new Error(unsatisfiedShape(origin, shape));
    }
    return value;
};

export const readJson = function readJson<T>(
    text: string,
    guard: (candidate: unknown) => candidate is T,
    origin: string,
    shape: string,
): T {
    return narrow(parseJson(text, origin), guard, origin, shape);
};