| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 | 
							- /** 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;
 
 
  |