diff --git a/implementations/javascript/packages/schema/src/compiler.ts b/implementations/javascript/packages/schema/src/compiler.ts index 969047f..8b6faee 100644 --- a/implementations/javascript/packages/schema/src/compiler.ts +++ b/implementations/javascript/packages/schema/src/compiler.ts @@ -17,7 +17,7 @@ export type CompileEnvEntry = { export function compile(env: Array, schema: Schema, preservesModule = '@preserves/core'): string { const literals = new Dictionary(); const types: Array = []; - const predicates: Array = []; + const functions: Array = []; let temps: Array = []; function environmentWith(name: symbol, @@ -234,12 +234,20 @@ export function compile(env: Array, schema: Schema, preservesMo } types.push( seq(`export type ${name.description!} = `, typeFor(pattern), `;`)); - predicates.push( + functions.push( seq('export function ', `is${name.description!}`, '(v: any): v is ', name.description!, ' ', block( ... temps.length > 0 ? [seq('let ', commas(... temps), ': any')] : [], seq('return ', recognizer)))); + functions.push( + seq('export function ', `as${name.description!}`, + '(v: any): ', name.description!, ' ', + block( + seq(`if (!is${name.description!}(v)) `, + block(`throw new TypeError("${name.description!}")`), + ' else ', + block(`return v`))))); } const f = new Formatter(); @@ -260,7 +268,7 @@ export function compile(env: Array, schema: Schema, preservesMo }); f.newline(); - predicates.forEach(p => { + functions.forEach(p => { f.write(p); f.newline(); f.newline(); diff --git a/implementations/javascript/packages/schema/src/reader.ts b/implementations/javascript/packages/schema/src/reader.ts index 24501c7..cce4362 100644 --- a/implementations/javascript/packages/schema/src/reader.ts +++ b/implementations/javascript/packages/schema/src/reader.ts @@ -54,9 +54,7 @@ export function parseSchema(toplevelTokens: Array): Schema { } definitions.set(name, parseDefinition(name, clause.slice(2).map(peel))); } else if (clause.length === 2 && is(clause[0], M.$version)) { - // TODO: use asVersion - if (!M.isVersion(clause[1])) invalidClause(clause); - version = clause[1]; + version = M.asVersion(clause[1]); } else { invalidClause(clause); } diff --git a/implementations/javascript/packages/schema/src/schemaschema.ts b/implementations/javascript/packages/schema/src/schemaschema.ts index 9351797..5dec04b 100644 --- a/implementations/javascript/packages/schema/src/schemaschema.ts +++ b/implementations/javascript/packages/schema/src/schemaschema.ts @@ -110,8 +110,12 @@ export function isSchema(v: any): v is Schema { ); } +export function asSchema(v: any): Schema {if (!isSchema(v)) {throw new TypeError("Schema");} else {return v;};} + export function isVersion(v: any): v is Version {return v === $1;} +export function asVersion(v: any): Version {if (!isVersion(v)) {throw new TypeError("Version");} else {return v;};} + export function isPattern(v: any): v is Pattern { return ( ( @@ -222,6 +226,8 @@ export function isPattern(v: any): v is Pattern { ); } +export function asPattern(v: any): Pattern {if (!isPattern(v)) {throw new TypeError("Pattern");} else {return v;};} + export function isNamedPattern(v: any): v is NamedPattern { return ( ( @@ -233,4 +239,8 @@ export function isNamedPattern(v: any): v is NamedPattern { ); } +export function asNamedPattern(v: any): NamedPattern { + if (!isNamedPattern(v)) {throw new TypeError("NamedPattern");} else {return v;}; +} +