import {generate, LineArg} from "./generator"; import * as sources from "./Source"; export function generateAssert (src : sources.Source) { generate({ checkName : src.name, generated : src.generated, imports : [ { alias : "check", path : src.generated ? `generated/sync/check/${src.name}` : `sync/check/${src.name}` }, { alias : "AssertError", path : "sync/error/AssertError", isSingle : true } ], writeDirectory : "sync/assert", lineCallback : (args : LineArg) : string[] => { const resultLines : string[] = []; resultLines.push(`export function assert${args.functionName}${args.genericArg} (name : string, ${args.functionArg.trim()}) : (${src.type})|never {`); resultLines.push(` const error = check.check${args.functionName}(${args.functionArgNames.join(", ")});`); resultLines.push(` if (error === undefined) {`); resultLines.push(` return mixed;`); resultLines.push(` } else {`); resultLines.push(` throw new AssertError(name, error, ${args.functionArgNames.join(", ")});`); resultLines.push(` }`); resultLines.push(`}`); resultLines.push(""); if (args.functionArgNames.length > 1) { resultLines.push(`export function assert${args.functionName}Handler${args.genericArg} (${args.functionArg.replace(/mixed\s*:\s*any\s*\,/, "").trim()}) : (name : string, mixed : any) => (${src.type})|never {`); resultLines.push(` return (name : string, mixed : any) : (${src.type})|never => {`); resultLines.push(` return assert${args.functionName}(name, ${args.functionArgNames.join(", ")});`); resultLines.push(` };`); resultLines.push(`}`); resultLines.push(""); } return resultLines; } }); }