mirror of
				https://github.com/actions/setup-go.git
				synced 2025-11-04 15:53:42 +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;
 |