diff --git a/implementations/javascript/packages/schema/src/checker.ts b/implementations/javascript/packages/schema/src/checker.ts index 8e8b118..f9a4043 100644 --- a/implementations/javascript/packages/schema/src/checker.ts +++ b/implementations/javascript/packages/schema/src/checker.ts @@ -2,14 +2,16 @@ import { typeFor, typeForIntersection } from './gentype'; import { ANY_TYPE, SimpleType } from './type'; import * as M from './meta'; -export function checkSchema(schema: M.Schema): M.Schema { +export function checkSchema(schema: M.Schema): ( + { ok: true, schema: M.Schema } | { ok: false, problems: Array }) +{ const checker = new Checker(); schema.definitions.forEach(checker.checkDefinition.bind(checker)); if (checker.problems.length > 0) { - throw new Error(`Schema does not specify a bijection:\n` + - checker.problems.map(c => ' - ' + c).join('\n')); + return { ok: false, problems: checker.problems }; + } else { + return { ok: true, schema }; } - return schema; } class Checker { diff --git a/implementations/javascript/packages/schema/src/reader.ts b/implementations/javascript/packages/schema/src/reader.ts index 5f90ee6..36f44e3 100644 --- a/implementations/javascript/packages/schema/src/reader.ts +++ b/implementations/javascript/packages/schema/src/reader.ts @@ -59,7 +59,10 @@ function _readSchema(source: string, options?: ReaderOptions): Array & SchemaReaderOptions): Schema { - return checkSchema(parseSchema(_readSchema(source, options), options ?? {})); + const checked = checkSchema(parseSchema(_readSchema(source, options), options ?? {})); + if (checked.ok) return checked.schema; + throw new Error(`Schema does not specify a bijection:\n` + + checked.problems.map(c => ' - ' + c).join('\n')); } export function parseSchema(toplevelTokens: Array,