import type { ParseOptions } from "../AST.js"; import { parserFor } from "./interpreter.js"; /** * @tsplus getter fncts.schema.Schema decode * @tsplus getter fncts.schema.Parser decode */ export function decode(schema: Schema): Parser { return parserFor(schema.ast, true); } /** * @tsplus getter fncts.schema.Schema decodeMaybe * @tsplus getter fncts.schema.Parser decodeMaybe */ export function decodeMaybe(schema: Schema): (input: A, options?: ParseOptions) => Maybe { return parseMaybe(schema.ast.getTo); } /** * @tsplus getter fncts.schema.Schema encode * @tsplus getter fncts.schema.Parser encode */ export function encode(schema: Schema): (input: A, options?: ParseOptions) => ParseResult { return parserFor(schema.ast, false); } /** * @tsplus getter fncts.schema.Schema encodeMaybe * @tsplus getter fncts.schema.Parser encodeMaybe */ export function encodeMaybe(schema: Schema): (input: A, options?: ParseOptions) => Maybe { return (input, options) => encode(schema)(input, options).toMaybe; } function parseMaybe(ast: AST) { const parse = parserFor(ast, true); return (input: unknown, options?: ParseOptions): Maybe => { return parse(input, options).toMaybe; }; } function parseOrThrow(ast: AST) { const parser = parserFor(ast, true); return (input: unknown, options?: ParseOptions) => { return parser(input, options).match((failure) => { throw new Error(ParseError.drawTree(failure)); }, Function.identity); }; } /** * @tsplus getter fncts.schema.Schema asserts * @tsplus getter fncts.schema.Parser asserts */ export function asserts(schema: Schema) { return (input: unknown, options?: ParseOptions): asserts input is A => { parseOrThrow(schema.ast.getTo)(input, options); }; }