| const { InvalidArgumentError } = require('./error.js');
|
|
|
| class Argument {
|
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| constructor(name, description) {
|
| this.description = description || '';
|
| this.variadic = false;
|
| this.parseArg = undefined;
|
| this.defaultValue = undefined;
|
| this.defaultValueDescription = undefined;
|
| this.argChoices = undefined;
|
|
|
| switch (name[0]) {
|
| case '<':
|
| this.required = true;
|
| this._name = name.slice(1, -1);
|
| break;
|
| case '[':
|
| this.required = false;
|
| this._name = name.slice(1, -1);
|
| break;
|
| default:
|
| this.required = true;
|
| this._name = name;
|
| break;
|
| }
|
|
|
| if (this._name.length > 3 && this._name.slice(-3) === '...') {
|
| this.variadic = true;
|
| this._name = this._name.slice(0, -3);
|
| }
|
| }
|
|
|
| |
| |
| |
| |
|
|
|
|
| name() {
|
| return this._name;
|
| }
|
|
|
| |
| |
|
|
|
|
| _concatValue(value, previous) {
|
| if (previous === this.defaultValue || !Array.isArray(previous)) {
|
| return [value];
|
| }
|
|
|
| return previous.concat(value);
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| default(value, description) {
|
| this.defaultValue = value;
|
| this.defaultValueDescription = description;
|
| return this;
|
| }
|
|
|
| |
| |
| |
| |
| |
|
|
|
|
| argParser(fn) {
|
| this.parseArg = fn;
|
| return this;
|
| }
|
|
|
| |
| |
| |
| |
| |
|
|
|
|
| choices(values) {
|
| this.argChoices = values.slice();
|
| this.parseArg = (arg, previous) => {
|
| if (!this.argChoices.includes(arg)) {
|
| throw new InvalidArgumentError(
|
| `Allowed choices are ${this.argChoices.join(', ')}.`,
|
| );
|
| }
|
| if (this.variadic) {
|
| return this._concatValue(arg, previous);
|
| }
|
| return arg;
|
| };
|
| return this;
|
| }
|
|
|
| |
| |
| |
| |
|
|
| argRequired() {
|
| this.required = true;
|
| return this;
|
| }
|
|
|
| |
| |
| |
| |
|
|
| argOptional() {
|
| this.required = false;
|
| return this;
|
| }
|
| }
|
|
|
| |
| |
| |
| |
| |
| |
|
|
|
|
| function humanReadableArgName(arg) {
|
| const nameOutput = arg.name() + (arg.variadic === true ? '...' : '');
|
|
|
| return arg.required ? '<' + nameOutput + '>' : '[' + nameOutput + ']';
|
| }
|
|
|
| exports.Argument = Argument;
|
| exports.humanReadableArgName = humanReadableArgName;
|
|
|