UNPKG

gorillajs

Version:

A smart development environment designed to easily install and neatly manage web applications. Gorilla JS frees you from the repetitive daily tasks like apps installation, database management, creation of virtual environment, server configuration… And it

150 lines (118 loc) • 3.59 kB
/** 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;