import { Config, ExtractConfigType } from "../config/builder/config" import { ActionMetaData, ActionResult, Effects, ExportedAction } from "../types" import { Utils, createUtils, utils } from "../util" import { WrapperDataContract } from "../wrapperData/wrapperDataContract" export class CreatedAction< WD, ConfigType extends Record | Config | Config, Type extends Record = ExtractConfigType, > { private constructor( readonly wrapperDataContract: WrapperDataContract, public readonly myMetaData: ActionMetaData, readonly fn: (options: { effects: Effects utils: Utils input: Type }) => Promise, readonly input: Config | Config, ) {} public validator = this.input.validator static of< WD, ConfigType extends | Record | Config | Config, Type extends Record = ExtractConfigType, >( wrapperDataContract: WrapperDataContract, metaData: Omit & { input: Config | Config }, fn: (options: { effects: Effects utils: Utils input: Type }) => Promise, ) { const { input, ...rest } = metaData return new CreatedAction( wrapperDataContract, rest, fn, input, ) } exportedAction: ExportedAction = ({ effects, input }) => { return this.fn({ effects, utils: createUtils(this.wrapperDataContract, effects), input: this.validator.unsafeCast(input), }) } run = async ({ effects, input }: { effects: Effects; input?: Type }) => { return this.fn({ effects, utils: createUtils(this.wrapperDataContract, effects), input: this.validator.unsafeCast(input), }) } async getConfig({ effects }: { effects: Effects }) { return this.input.build({ effects, utils: createUtils(this.wrapperDataContract, effects) as any, }) } } export const createAction = CreatedAction.of