import { Snowflake } from "discord.js";
export interface MessageCommandOptionData {
    name: string;
    description: string;
    readonly type: MessageCommandOptionType;
}
/**
 * A composable option/argument to add to a message command.
 * @abstract
 */
export declare abstract class MessageCommandOption {
    /**
     * The name of the option.
     */
    name: string;
    /**
     * The description of the option.
     */
    description: string;
    /**
     * The type of the option.
     */
    readonly type: MessageCommandOptionType;
    constructor(data: MessageCommandOptionType | MessageCommandOptionData);
    /**
     * Sets the name of the option. Cannot be empty.
     * @param name The name of the option.
     * @returns The option instance.
     */
    setName(name: string): this;
    /**
     * Sets the name of the option. Cannot be empty.
     * @param description The description of the option.
     * @returns The option instance.
     */
    setDescription(description: string): this;
    /**
     * Performs a type-specific validation on the option.
     * @param option The option to compare to.
     */
    abstract validate(option: string): unknown;
}
/**
 * A option that can be supplied with pre-defined values for the user to choose from.
 * @abstract
 * @extends MessageCommandOption
 */
export declare abstract class MessageCommandOptionChoiceable<T extends string | number> extends MessageCommandOption {
    /**
     * The available pre-determined choices for this option.
     */
    choices: MessageCommandOptionChoice<T>[];
    constructor(type: MessageCommandOptionType);
    /**
     * Add a choice for this option. Chain this multiple times to add more options OR use {@link MessageCommandOptionChoiceable.setChoices}.
     * @param choice The choice to add.
     * @returns The option instance.
     */
    addChoice(...choice: MessageCommandOptionChoice<T>): this;
    /**
     * Add multiple choices for this option. Use this either once OR chain {@link MessageCommandOptionChoiceable.addChoice}.
     * @param choices The choices to add.
     * @returns	The option instance.
     */
    setChoices(choices: MessageCommandOptionChoice<T>[]): this;
}
/**
 * A string option. Allows choices.
 * @extends MessageCommandOptionChoiceable
 */
export declare class MessageCommandStringOption extends MessageCommandOptionChoiceable<string> {
    constructor();
    validate(option: string): string | undefined;
}
/**
 * A number option. Allows choices.
 * @extends MessageCommandOptionChoiceable
 */
export declare class MessageCommandNumberOption extends MessageCommandOptionChoiceable<number> {
    constructor();
    validate(option: string): number | undefined;
}
/**
 * A boolean option.
 * @extends MessageCommandOption
 */
export declare class MessageCommandBooleanOption extends MessageCommandOption {
    constructor();
    validate(option: string): boolean | undefined;
}
/**
 * A member mentionable option.
 * @extends MessageCommandOption
 */
export declare class MessageCommandMemberOption extends MessageCommandOption {
    constructor();
    validate(option: string): Snowflake | undefined;
}
/**
 * A channel mentionable option.
 * @extends MessageCommandOption
 */
export declare class MessageCommandChannelOption extends MessageCommandOption {
    constructor();
    validate(option: string): Snowflake | undefined;
}
/**
 * A role mentionable option.
 * @extends MessageCommandOption
 */
export declare class MessageCommandRoleOption extends MessageCommandOption {
    constructor();
    validate(option: string): Snowflake | undefined;
}
/**
 * An enum containing user-friendly values for each option type.
 */
export declare const enum MessageCommandOptionType {
    BOOLEAN = "true/false",
    NUMBER = "number",
    STRING = "text",
    MEMBER = "member",
    CHANNEL = "channel",
    ROLE = "role"
}
/**
 * A tuple containing both the name and value for each option choice.
 */
export declare type MessageCommandOptionChoice<ValueType extends string | number> = [name: string, value: ValueType];
export interface MessageCommandOptionError {
    message: string;
    type: keyof typeof MessageCommandOptionErrors;
}
export declare const MessageCommandOptionErrors: {
    readonly INVALID_ARG_TYPE: "INVALID_ARG_TYPE";
    readonly MISSING_ARGS: "MISSING_ARGS";
    readonly MISSING_PERMISSIONS: "MISSING_PERMISSIONS";
    readonly MISSING_ROLES: "MISSING_ROLES";
};
