discord-bot-cli
Version:
An easy way to build a command-based discord bot with discord.js.
67 lines (66 loc) • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseFlags = void 0;
const parseValue_1 = require("./parseValue");
const CommandResult_1 = require("../../models/CommandResult");
const CommandResultError_1 = require("../../models/errors/CommandResultError");
/** @internal */
function parseFlags(message, inputArguments, flagDefinitions, shortcuts) {
const args = [...inputArguments];
const flagValues = new Map(Array.from(flagDefinitions.entries()).map(([k, v]) => [k, v.defaultValue]));
function parse(index, flagName, flagValue, dontUseNextArg) {
const flag = flagDefinitions.get(flagName);
if (!flag)
throw new CommandResultError_1.CommandResultError(CommandResult_1.CommandResultUtils.failParseFlagUnknown(flagName));
if (flagValue) {
const parsed = parseValue_1.parseValue(flag, message, flagValue);
if (parsed.value === undefined)
throw new CommandResultError_1.CommandResultError(CommandResult_1.CommandResultUtils.failParseFlagInvalid(flag, flagValue), parsed.message);
flagValues.set(flagName, parsed.value);
args.splice(index, 1);
}
else {
if (flag.type === "boolean") {
flagValues.set(flagName, true);
args.splice(index, 1);
}
else {
if (dontUseNextArg || index + 1 >= args.length)
throw new CommandResultError_1.CommandResultError(CommandResult_1.CommandResultUtils.failParseFlagInvalid(flag, ""));
const parsed = parseValue_1.parseValue(flag, message, args[index + 1]);
if (parsed.value === undefined)
throw new CommandResultError_1.CommandResultError(CommandResult_1.CommandResultUtils.failParseFlagInvalid(flag, args[index + 1]), parsed.message);
flagValues.set(flagName, parsed.value);
args.splice(index, 2);
}
}
}
for (let i = 0; i < args.length; i++) {
const f = args[i];
if (f.match(/^--[^-].*$/)) {
const parts = f.substring(2).split("=");
parse(i, parts[0], parts.length > 1 ? parts[1] : undefined);
}
else if (f.match(/^-[a-zA-Z](=.+)?$/)) {
const parts = f.substring(1).split("=");
const flagName = shortcuts === null || shortcuts === void 0 ? void 0 : shortcuts.get(parts[0]);
if (!flagName)
throw new CommandResultError_1.CommandResultError(CommandResult_1.CommandResultUtils.failParseFlagUnknown(parts[0]));
parse(i, flagName, parts.length > 1 ? parts[1] : undefined);
}
else if (f.match(/^-[a-zA-Z]{2,}$/)) {
const flags = f.substring(1).split("");
for (let j = 0; j < flags.length; j++) {
const flagName = shortcuts === null || shortcuts === void 0 ? void 0 : shortcuts.get(flags[j]);
if (!flagName)
throw new CommandResultError_1.CommandResultError(CommandResult_1.CommandResultUtils.failParseFlagUnknown(flags[j]));
parse(i, flagName, undefined, j != flags.length - 1);
}
}
else
continue;
i--;
}
return { args, flagValues };
}
exports.parseFlags = parseFlags;