75 lines
2.7 KiB
JavaScript
75 lines
2.7 KiB
JavaScript
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 };
|