mirror of
				https://github.com/optim-enterprises-bv/control-pane.git
				synced 2025-10-30 17:37:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			150 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /** 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;
 | 
