import { Parser } from "ts-matches"; import { Config } from "../config/builder"; import { ActionMetaData, ActionResult, Effects, ExportedAction, } from "../types"; import { Utils, once, utils } from "../util"; import { TypeFromProps } from "../util/propertiesMatcher"; import { InputSpec } from "../config/configTypes"; export class CreatedAction> { private constructor( private myMetaData: Omit & { input: Input }, readonly fn: (options: { effects: Effects; utils: Utils; input: TypeFromProps; }) => Promise, ) {} private validator = this.myMetaData.input.validator() as Parser< unknown, TypeFromProps >; metaData = { ...this.myMetaData, input: this.myMetaData.input.build(), }; static of>( metaData: Omit & { input: Input }, fn: (options: { effects: Effects; utils: Utils; input: TypeFromProps; }) => Promise, ) { return new CreatedAction(metaData, fn); } exportedAction: ExportedAction = ({ effects, input }) => { return this.fn({ effects, utils: utils(effects), input: this.validator.unsafeCast(input), }); }; async exportAction(effects: Effects) { await effects.exportAction(this.metaData); } } export const createAction = CreatedAction.of;