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);
};
}