core/parsers/schema.parser.ts

core/parsers/schema.parser.ts is a file in GovLab Patterns. 35 lines of code and 7 definitions.

import type { FieldSchema, Kind, Primitive } from "#types/schema.types";
import { SCHEMA_NOT_ARRAY, invalidSchemaField } from "#configuration/strings/schema.strings";
import { DataLoadError } from "#core/classifiers/schema.classifier";
import { isRecord } from "#core/predicates/record.predicate";

const KIND_NAMES: ReadonlySet<string> = new Set(["list-of-objects", "list", "object", "scalar"]);
const PRIMITIVE_NAMES: ReadonlySet<string> = new Set(["boolean", "float", "integer", "string"]);

const isKind = function isKind(value: unknown): value is Kind {
    return typeof value === "string" && KIND_NAMES.has(value);
};

const isPrimitive = function isPrimitive(value: unknown): value is Primitive {
    return typeof value === "string" && PRIMITIVE_NAMES.has(value);
};

const fieldFromDict = function fieldFromDict(raw: unknown): FieldSchema {
    if (!isRecord(raw)) {
        throw new DataLoadError(invalidSchemaField(JSON.stringify(raw)));
    }
    const { name, kind, primitive, fixedLength, elementNumeric, nullable } = raw;
    if (typeof name !== "string" || !isKind(kind)) {
        throw new DataLoadError(invalidSchemaField(JSON.stringify(raw)));
    }
    return {
        elementNumeric: elementNumeric === true,
        fixedLength: typeof fixedLength === "number" ? fixedLength : null,
        kind,
        name,
        nullable: nullable === true,
        primitive: isPrimitive(primitive) ? primitive : null,
    };
};

export const schemaFromDict = function schemaFromDict(data: unknown): FieldSchema[] {
    if (!Array.isArray(data)) {
        throw new DataLoadError(SCHEMA_NOT_ARRAY);
    }
    return data.map(fieldFromDict);
};