export enum MatchTypes { 'flag', 'mention', 'content', 'rest' } export interface Args { name: string match: MatchTypes type?: unknown // Still needs to be implemented defaultValue?: unknown // Still needs to be implemented flag?: string } const mentionRegex = /([0-9]{18})/g export function parseArgs( commandArgs: Args[] | undefined, messageArgs: string[] ): Record | null { if (!commandArgs) return null const messageArgsNullableCopy: Array = [...messageArgs] const args: Record = {} for (const entry of commandArgs) { switch (entry.match) { case MatchTypes.flag: parseFlags(args, entry, messageArgsNullableCopy) break case MatchTypes.mention: parseMention(args, entry, messageArgsNullableCopy) break case MatchTypes.content: parseContent(args, entry, messageArgs) break case MatchTypes.rest: parseRest(args, entry, messageArgsNullableCopy) break } } return args } function parseFlags( args: Record, entry: Args, argsNullable: Array ): void { for (let i = 0; i < argsNullable.length; i++) { if (entry.flag === argsNullable[i]) { argsNullable[i] = null args[entry.name] = true break } else args[entry.name] = entry.defaultValue } return } function parseMention( args: Record, entry: Args, argsNullable: Array ): void { const index = argsNullable.findIndex((x) => typeof x === 'string') const mention = mentionRegex.exec(argsNullable[index]!)![0] argsNullable[index] = null args[entry.name] = mention return } function parseContent( args: Record, entry: Args, argsNonNullable: Array ): void { args[entry.name] = argsNonNullable.length !== 0 ? argsNonNullable : entry.defaultValue return } function parseRest( args: Record, entry: Args, argsNullable: Array ): void { args[entry.name] = argsNullable.filter((x) => typeof x === 'string') }