2014-11-19 8 views
1

Новичок в Minimist анализатор команд и проблема с ним.
Пользователь вводит команду:Подтверждение команды в мини-редакторе

Project -a 

я должен проверить, если вводится команда имеет правильный выбор.
Так что мой код выглядит следующим образом:

var commands = ["project", "user"]; 
var commandEntered = require('minimist')(command.split(' ')); 
if(commands.indexOf(commandEntered._) > -1){ 
    //i.e. Check if user has entered either project or user and then do following 
    if(commandEntered._ == "project") { 
    var options = ["a", "u", "l"]; 
     delete commandEntered._; 
     var optionsEntered = Object.keys(commandEntered); 
     for(var i=0;i<optionsEntered.length;i++){ 
      if(options.indexOf(optionsEntered) > -1){ 
       if(optionsEntered == "a" && commandEntered.a == true) 
       { 
        console.log("Option a entered"); 
       } 
      } 
     } 
    } 
} 
else{ 
    return "Invalid Command"; 
} 

Как будет проверять команду нежелательных вариантов или сказать, если есть команда:

project -a -n <name> 

Как установить правила, рассказывающие, что если опция " n ', тогда должно быть указано имя, а опция' l 'не может быть включена, если присутствует опция' a '. Есть ли способ исправить это?

Заранее спасибо

ответ

1

Это может быть простой или сложной проверкой, в зависимости от ваших потребностей.

Базовая проверка, если есть 'а' команда:

if (commandEntered.a) { 
    console.log('we have option a') 
} else { 
    console.log("we don't have it") 
} 

Проверка наличия нежелательных вариантов (например):

var validOptions = ['a', 'u', 'l']; 
function isOptionPresent(opt) { 
    for (var i = 0; i<validOptions.length; i++) { 
    if (validOptions[i] == opt) { 
     return true 
    } 
    } 
    return false 
} 

for (var opt in commandEntered) { 
    if (!isOptionPresent(opt)) { 
    console.log('this command is not allowed') 
    console.log('use these commands: ' + validOptions) 
    } 
} 

Также обратите внимание, что вы, вероятно, хотите изменить свою линию (добавление [0 ]):

if(commands.indexOf(commandEntered._[0]) > -1){ 

Сложные правила, как вы упомянули в последнем предложении - вы можете проверить их один за другим, если это просто е

if (commandEntered.a && !commandEntered.l) { 
    console.log('you have to provide L command with A command') 
} 
if (commandEntered.n && 'string' !== typeof(commandEntered.n)) { 
    console.log('command N must be followed with name of type string') 
    console.log('e.g. -n myname') 
} 

Если можно сделать лучше, с помощью объекта вместо простого массива, который также будет определять тип параметра, так что вы не будете повторять себя слишком много (тогда вам не нужно isOptionPresent() функция):

var validOptions = {'a':'boolean', 'n':'string', 'l':'boolean'}; 
for (var opt in commandEntered) { 
    if (!validOptions[opt]) { 
    console.log('this command is not allowed') 
    console.log('use these commands: ' + Object.keys(validOptions)) 
    } 
} 

if (commandEntered.n && validOptions[opt] !== typeof(commandEntered.n)) { 
    console.log('command N must be followed with name of type string') 
    console.log('e.g. -n myname') 
} 

Если есть много сложных правила, может быть, лучше думать о какой-то структуре, которая будет определять правила интер отношения и проверить, если передаваемая команда соответствует структуре. Но я думаю, это слишком далеко от того, что вы хотите.

Смежные вопросы