You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/** 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;
|