Spaces:
Sleeping
Sleeping
| /** internal | |
| * class ActionSubparsers | |
| * | |
| * Support the creation of such sub-commands with the addSubparsers() | |
| * | |
| * This class inherited from [[Action]] | |
| **/ | |
| ; | |
| 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; | |