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