55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
|
import { ICommandOption, OptionType } from "../interfaces/CommandOption";
|
||
|
import { ICommand, CommandDefinition } from "../interfaces/Command";
|
||
|
import SubcommandOption from "./SubcommandOption";
|
||
|
import SubcommandGroupOption from "./SubcommandGroupOption";
|
||
|
|
||
|
class Command implements ICommand {
|
||
|
|
||
|
name: string;
|
||
|
|
||
|
aliases: string[];
|
||
|
|
||
|
options: ICommandOption[];
|
||
|
|
||
|
constructor(def: CommandDefinition) {
|
||
|
|
||
|
this.name = def.name;
|
||
|
|
||
|
this.aliases = def.aliases || [];
|
||
|
|
||
|
this.options = def.options || [];
|
||
|
|
||
|
}
|
||
|
|
||
|
get subcommands(): SubcommandOption[] {
|
||
|
return this._subcommands(this.options);
|
||
|
}
|
||
|
|
||
|
get subcommandGroups(): SubcommandGroupOption[] {
|
||
|
return this.options.filter((opt) => opt.type === OptionType.SUB_COMMAND_GROUP);
|
||
|
}
|
||
|
|
||
|
subcommand(name: string): SubcommandOption | null {
|
||
|
name = name.toLowerCase();
|
||
|
return this.subcommands.find((cmd) => cmd.name === name) || null;
|
||
|
}
|
||
|
|
||
|
subcommandGroup(name: string): SubcommandGroupOption | null {
|
||
|
name = name.toLowerCase();
|
||
|
return this.subcommandGroups.find((opt) => opt.name === name) || null;
|
||
|
}
|
||
|
|
||
|
private _subcommands(options: ICommandOption[]): SubcommandOption[] {
|
||
|
const subcommands: SubcommandOption[] = [];
|
||
|
for (const opt of options) {
|
||
|
if (opt.type === OptionType.SUB_COMMAND) subcommands.push(opt);
|
||
|
else if(opt.type === OptionType.SUB_COMMAND_GROUP) subcommands.push(...this._subcommands(opt.options));
|
||
|
}
|
||
|
|
||
|
return subcommands;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
export { Command };
|
||
|
export default Command;
|