import * as T from "../types" import * as IST from "../actions/input/inputSpecTypes" import { Action } from "./setupActions" import { ExtractInputSpecType } from "./input/builder/inputSpec" export type RunActionInput = | Input | ((prev?: { spec: IST.InputSpec; value: Input | null }) => Input) export const runAction = async < Input extends Record, >(options: { effects: T.Effects // packageId?: T.PackageId actionId: T.ActionId input?: RunActionInput }) => { if (options.input) { if (options.input instanceof Function) { const prev = await options.effects.action.getInput({ // packageId: options.packageId, actionId: options.actionId, }) const input = options.input( prev ? { spec: prev.spec as IST.InputSpec, value: prev.value as Input } : undefined, ) return options.effects.action.run({ // packageId: options.packageId, actionId: options.actionId, input, }) } else { return options.effects.action.run({ // packageId: options.packageId, actionId: options.actionId, input: options.input, }) } } else { return options.effects.action.run({ // packageId: options.packageId, actionId: options.actionId, }) } } type GetActionInputType> = A extends Action ? ExtractInputSpecType : never type ActionRequestBase = { reason?: string replayId?: string } type ActionRequestInput> = { kind: "partial" value: Partial> } export type ActionRequestOptions> = ActionRequestBase & ( | { when?: Exclude< T.ActionRequestTrigger, { condition: "input-not-matches" } > input?: ActionRequestInput } | { when: T.ActionRequestTrigger & { condition: "input-not-matches" } input: ActionRequestInput } ) const _validate: T.ActionRequest = {} as ActionRequestOptions & { actionId: string packageId: string severity: T.ActionSeverity } export const requestAction = >(options: { effects: T.Effects packageId: T.PackageId action: T severity: T.ActionSeverity options?: ActionRequestOptions }) => { const request = options.options || {} const actionId = options.action.id const req = { ...request, actionId, packageId: options.packageId, action: undefined, severity: options.severity, replayId: request.replayId || `${options.packageId}:${actionId}`, } delete req.action return options.effects.action.request(req) }