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