{"version":3,"file":"Function.cjs","sources":["../../src/types/Function.ts"],"sourcesContent":["import { Infer } from \"../types\";\nimport XVType from \"../XVType\";\n\ntype Func<\n  A extends XVType<any>[],\n  R extends XVType<any>,\n  Async extends boolean = false,\n> = Async extends true\n  ? (...args: { [K in keyof A]: Infer<A[K]> }) => Promise<Infer<R>>\n  : (...args: { [K in keyof A]: Infer<A[K]> }) => Infer<R>;\n\nexport type XVFunctionOptions<\n  A extends XVType<any>[],\n  R extends XVType<any>,\n> = {\n  args: A;\n  returns: R;\n  async?: boolean;\n};\n\nclass XVFunction<\n  A extends XVType<any>[],\n  R extends XVType<any>,\n  Async extends boolean = false,\n> extends XVType<Func<A, R, Async>> {\n  readonly func_args: A;\n  readonly func_return: R;\n  readonly is_async: Async;\n\n  constructor(options: XVFunctionOptions<A, R>) {\n    super();\n\n    this.func_args = options.args;\n    this.func_return = options.returns;\n    this.is_async = (options.async ?? false) as Async;\n  }\n\n  protected check(value: unknown): Func<A, R, Async> {\n    if (typeof value !== \"function\") {\n      throw new Error(`Value should be a function, received ${typeof value}`);\n    }\n\n    return value as Func<A, R, Async>;\n  }\n\n  parse(fn: unknown): Func<A, R, Async> | undefined | null {\n    const checked = super.parse(fn);\n    if (this.meta.optional && !checked) {\n      return;\n    }\n    if (this.meta.nullable && !checked) {\n      return null;\n    }\n\n    return ((...args: unknown[]) => {\n      try {\n        const parsedArgs = this.func_args.map((validator, i) =>\n          validator.parse(args[i]),\n        ) as { [K in keyof A]: Infer<A[K]> };\n\n        const result = checked!(...parsedArgs);\n\n        if (this.is_async) {\n          if (!(result instanceof Promise)) {\n            throw new Error(`Expected async function to return Promise`);\n          }\n\n          return result.then((res) => this.func_return.parse(res));\n        }\n\n        try {\n          return this.func_return.parse(result);\n        } catch (error) {\n          throw new Error(`Function return value ${error}`);\n        }\n      } catch (error) {\n        throw new Error(`Function args ${error}`);\n      }\n    }) as Func<A, R, Async>;\n  }\n}\n\nexport default XVFunction;\n"],"names":[],"mappings":";;;;AAoBA,MAAM,UAIJ,SAAQ,MAAyB,CAAA;AAKjC,IAAA,WAAA,CAAY,OAAgC,EAAA;;AAC1C,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI;AAC7B,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,OAAO;QAClC,IAAI,CAAC,QAAQ,IAAI,CAAA,EAAA,GAAA,OAAO,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK,CAAU;IACnD;AAEU,IAAA,KAAK,CAAC,KAAc,EAAA;AAC5B,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;YAC/B,MAAM,IAAI,KAAK,CAAC,CAAA,qCAAA,EAAwC,OAAO,KAAK,CAAA,CAAE,CAAC;QACzE;AAEA,QAAA,OAAO,KAA0B;IACnC;AAEA,IAAA,KAAK,CAAC,EAAW,EAAA;QACf,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;YAClC;QACF;QACA,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,EAAE;AAClC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,QAAQ,CAAC,GAAG,IAAe,KAAI;AAC7B,YAAA,IAAI;gBACF,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,KACjD,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CACU;AAEpC,gBAAA,MAAM,MAAM,GAAG,OAAQ,CAAC,GAAG,UAAU,CAAC;AAEtC,gBAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,oBAAA,IAAI,EAAE,MAAM,YAAY,OAAO,CAAC,EAAE;AAChC,wBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,yCAAA,CAA2C,CAAC;oBAC9D;AAEA,oBAAA,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1D;AAEA,gBAAA,IAAI;oBACF,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;gBACvC;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAA,CAAE,CAAC;gBACnD;YACF;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAA,CAAE,CAAC;YAC3C;AACF,QAAA,CAAC;IACH;AACD;;;;"}