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.
		
		
		
		
		
			
		
			
				
					
					
						
							149 lines
						
					
					
						
							3.5 KiB
						
					
					
				
			
		
		
	
	
							149 lines
						
					
					
						
							3.5 KiB
						
					
					
				/** 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;
 | 
						|
 |