import { PluginData } from "knub"; import { Awaitable } from "knub/dist/utils"; import * as t from "io-ts"; import { AutomodContext, AutomodPluginType } from "./types"; export interface AutomodTriggerMatchResult { extraContexts?: AutomodContext[]; extra?: TExtra; silentClean?: boolean; // TODO: Maybe generalize to a "silent" value in general, which mutes alert/log } type AutomodTriggerMatchFn = (meta: { ruleName: string; pluginData: PluginData; context: AutomodContext; triggerConfig: TConfigType; }) => Awaitable>; type AutomodTriggerRenderMatchInformationFn = (meta: { ruleName: string; pluginData: PluginData; contexts: AutomodContext[]; triggerConfig: TConfigType; matchResult: AutomodTriggerMatchResult; }) => Awaitable; export interface AutomodTriggerBlueprint { configType: TConfigType; defaultConfig: Partial>; match: AutomodTriggerMatchFn, TMatchResultExtra>; renderMatchInformation: AutomodTriggerRenderMatchInformationFn, TMatchResultExtra>; } export function automodTrigger(): ( blueprint: AutomodTriggerBlueprint, ) => AutomodTriggerBlueprint; export function automodTrigger( blueprint: AutomodTriggerBlueprint, ): AutomodTriggerBlueprint; export function automodTrigger(...args) { if (args.length) { return args[0]; } else { return automodTrigger; } } type AutomodActionApplyFn = (meta: { ruleName: string; pluginData: PluginData; contexts: AutomodContext[]; actionConfig: TConfigType; }) => Awaitable; export interface AutomodActionBlueprint { configType: TConfigType; apply: AutomodActionApplyFn>; } export function automodAction( blueprint: AutomodActionBlueprint, ): AutomodActionBlueprint { return blueprint; }