import { _array, _tuple, _unknown } from "./api.js"; import { parse, parseAsync } from "./parse.js"; import * as schemas from "./schemas.js"; import { $ZodTuple } from "./schemas.js"; export class $ZodFunction { constructor(def) { this._def = def; this.def = def; } implement(func) { if (typeof func !== "function") { throw new Error("implement() must be called with a function"); } const impl = ((...args) => { const parsedArgs = this._def.input ? parse(this._def.input, args, undefined, { callee: impl }) : args; if (!Array.isArray(parsedArgs)) { throw new Error("Invalid arguments schema: not an array or tuple schema."); } const output = func(...parsedArgs); return this._def.output ? parse(this._def.output, output, undefined, { callee: impl }) : output; }); return impl; } implementAsync(func) { if (typeof func !== "function") { throw new Error("implement() must be called with a function"); } const impl = (async (...args) => { const parsedArgs = this._def.input ? await parseAsync(this._def.input, args, undefined, { callee: impl }) : args; if (!Array.isArray(parsedArgs)) { throw new Error("Invalid arguments schema: not an array or tuple schema."); } const output = await func(...parsedArgs); return this._def.output ? parseAsync(this._def.output, output, undefined, { callee: impl }) : output; }); return impl; } input(...args) { const F = this.constructor; if (Array.isArray(args[0])) { return new F({ type: "function", input: new $ZodTuple({ type: "tuple", items: args[0], rest: args[1], }), output: this._def.output, }); } return new F({ type: "function", input: args[0], output: this._def.output, }); } output(output) { const F = this.constructor; return new F({ type: "function", input: this._def.input, output, }); } } function _function(params) { return new $ZodFunction({ type: "function", input: Array.isArray(params?.input) ? _tuple(schemas.$ZodTuple, params?.input) : (params?.input ?? _array(schemas.$ZodArray, _unknown(schemas.$ZodUnknown))), output: params?.output ?? _unknown(schemas.$ZodUnknown), }); } export { _function as function };