import { Symbols } from '../Symbols';
import type { APIApplicationCommandOption, RESTPostAPIApplicationCommandsJSONBody } from 'discord-api-types/v9';
import { CommandInteraction } from '../types';
import { CommandHandler } from '../handler/CommandHandler';
import { WorkerInject } from '../structures/WorkerInject';
export interface CommandMeta {
    canRun: Array<RunningFunction<boolean>>;
    onRun: Array<RunningFunction<void>>;
    name: string | symbol;
    params: ParamResolver[];
    interactionOptions?: APIApplicationCommandOption[];
    indexToOption: {
        [key: number]: string;
    };
    method: string;
}
export declare type ParamResolver = (int: CommandInteraction, handler: CommandHandler) => any;
export declare type RunningFunction<R extends any> = (interaction: CommandInteraction, handler: CommandHandler) => R | Promise<R>;
declare const baseSymbols: {
    [Symbols.commandName]: string;
    [Symbols.aliases]: string[];
    [Symbols.interaction]: RESTPostAPIApplicationCommandsJSONBody;
    [Symbols.guild]: string | undefined;
    [Symbols.commands]: CommandMeta[];
    [Symbols.injections]: WorkerInject<import("jadl").Worker<{}>>[];
};
export declare type BaseSymbols = typeof baseSymbols;
export declare type baseDecorator<O extends any> = (options: O, command: BaseSymbols) => void | Promise<void>;
export declare type commandDecorator<O extends any> = (options: O, command: CommandMeta, base: BaseSymbols, descriptor: TypedPropertyDescriptor<Function>) => void | Promise<void>;
export declare type parameterDecorator<O extends any, R extends any = ParamResolver> = (options: O, command: CommandMeta, base: BaseSymbols, index: number) => R;
export declare const Decorators: {
    createBaseDecorator: <O extends any[] = undefined[]>(handler: baseDecorator<O>) => (...options: O) => ClassDecorator;
    setupCommandMeta: (target: BaseSymbols) => void;
    getCommandMeta(target: BaseSymbols, method: string): CommandMeta;
    createCommandDecorator: <O_1 extends any[] = undefined[]>(running: commandDecorator<O_1>, extension?: MethodDecorator) => (...options: O_1) => MethodDecorator;
    createParameterDecorator: <O_2 extends any[] = undefined[]>(paramHandler: parameterDecorator<O_2, ParamResolver>) => (...options: O_2) => ParameterDecorator;
    createParameterAddition: <O_3 extends any[] = undefined[]>(paramHandler: parameterDecorator<O_3, void>) => (...options: O_3) => ParameterDecorator;
};
export {};
