Как заставить nodejs аргумент сценария принимать значение из списка вариантов, используя commander? - PullRequest
0 голосов
/ 02 марта 2020

Я использую commander в node.js скрипте. Я могу установить значение по умолчанию для одного аргумента.

var args = require('commander')

// set 'pending' as defaut value of status
args.option('-s --status <statusString>', 'Status to filter questions', 'pending').parse(process.argv)

console.log('status:', args.status)

Как заставить значение status быть только из ["pending", "rejected", "accepted", "hold"]? Я не нашел ничего уместного в документации.

1 Ответ

0 голосов
/ 06 мая 2020

Это то, что я мог бы достичь:

var options = ["pending", "rejected", "accepted", "hold"];
args.option(
       '-s --status <statusString>', 
       `Status to filter questions: ${options}`,
       function(val, _) {
          if (!options.includes(val)) {
             throw Error(`${val} is not from ${options}`);
          }
          return val;
       },
    'pending')
    .parse(process.argv)

Не идеально, так как вам нужно отформатировать строку справки и проверить значение ввода самостоятельно. Кроме того, генерирование ошибки из функции проверки не обрабатывается Commander красиво и приводит к сбою со всей трассировкой стека в выводе. Я не смог найти лучшего способа сообщить Commander, что ввод неверен.

В моем случае я, наконец, просто переключился на argparse , который является клоном парсера командной строки Python и, кажется, лучше продумано. Вот как вы ограничиваете выбор:

const ArgumentParser = require('argparse').ArgumentParser;
const argparser = new ArgumentParser({ description: 'An example'});
argparser.addArgument('--status', {  
    choices: ['pending', 'rejected', 'accepted', 'hold'],
    defaultValue: 'pending'});
const args = argparser.parseArgs();

Это сделает всю работу, включая хорошее справочное сообщение и проверку ввода.

...