diff options
Diffstat (limited to 'node_modules/argparse/lib/action/subparsers.js')
| -rw-r--r-- | node_modules/argparse/lib/action/subparsers.js | 149 | 
1 files changed, 149 insertions, 0 deletions
diff --git a/node_modules/argparse/lib/action/subparsers.js b/node_modules/argparse/lib/action/subparsers.js new file mode 100644 index 0000000..99dfedd --- /dev/null +++ b/node_modules/argparse/lib/action/subparsers.js @@ -0,0 +1,149 @@ +/** internal + * class ActionSubparsers + * + * Support the creation of such sub-commands with the addSubparsers() + * + * This class inherited from [[Action]] + **/ +'use strict'; + +var util    = require('util'); +var format  = require('util').format; + + +var Action = require('../action'); + +// Constants +var c = require('../const'); + +// Errors +var argumentErrorHelper = require('../argument/error'); + + +/*:nodoc:* + * new ChoicesPseudoAction(name, help) + * + * Create pseudo action for correct help text + * + **/ +function ChoicesPseudoAction(name, help) { +  var options = { +    optionStrings: [], +    dest: name, +    help: help +  }; + +  Action.call(this, options); +} + +util.inherits(ChoicesPseudoAction, Action); + +/** + * new ActionSubparsers(options) + * - options (object): options hash see [[Action.new]] + * + **/ +function ActionSubparsers(options) { +  options = options || {}; +  options.dest = options.dest || c.SUPPRESS; +  options.nargs = c.PARSER; + +  this.debug = (options.debug === true); + +  this._progPrefix = options.prog; +  this._parserClass = options.parserClass; +  this._nameParserMap = {}; +  this._choicesActions = []; + +  options.choices = this._nameParserMap; +  Action.call(this, options); +} + +util.inherits(ActionSubparsers, Action); + +/*:nodoc:* + * ActionSubparsers#addParser(name, options) -> ArgumentParser + * - name (string): sub-command name + * - options (object): see [[ArgumentParser.new]] + * + *  Note: + *  addParser supports an additional aliases option, + *  which allows multiple strings to refer to the same subparser. + *  This example, like svn, aliases co as a shorthand for checkout + * + **/ +ActionSubparsers.prototype.addParser = function (name, options) { +  var parser; + +  var self = this; + +  options = options || {}; + +  options.debug = (this.debug === true); + +  // set program from the existing prefix +  if (!options.prog) { +    options.prog = this._progPrefix + ' ' + name; +  } + +  var aliases = options.aliases || []; + +  // create a pseudo-action to hold the choice help +  if (!!options.help || typeof options.help === 'string') { +    var help = options.help; +    delete options.help; + +    var choiceAction = new ChoicesPseudoAction(name, help); +    this._choicesActions.push(choiceAction); +  } + +  // create the parser and add it to the map +  parser = new this._parserClass(options); +  this._nameParserMap[name] = parser; + +  // make parser available under aliases also +  aliases.forEach(function (alias) { +    self._nameParserMap[alias] = parser; +  }); + +  return parser; +}; + +ActionSubparsers.prototype._getSubactions = function () { +  return this._choicesActions; +}; + +/*:nodoc:* + * ActionSubparsers#call(parser, namespace, values, optionString) -> Void + * - parser (ArgumentParser): current parser + * - namespace (Namespace): namespace for output data + * - values (Array): parsed values + * - optionString (Array): input option string(not parsed) + * + * Call the action. Parse input aguments + **/ +ActionSubparsers.prototype.call = function (parser, namespace, values) { +  var parserName = values[0]; +  var argStrings = values.slice(1); + +  // set the parser name if requested +  if (this.dest !== c.SUPPRESS) { +    namespace[this.dest] = parserName; +  } + +  // select the parser +  if (this._nameParserMap[parserName]) { +    parser = this._nameParserMap[parserName]; +  } else { +    throw argumentErrorHelper(format( +      'Unknown parser "%s" (choices: [%s]).', +        parserName, +        Object.keys(this._nameParserMap).join(', ') +    )); +  } + +  // parse all the remaining options into the namespace +  parser.parseArgs(argStrings, namespace); +}; + +module.exports = ActionSubparsers;  | 
