123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
-
- 'use strict';
-
- var util = require('util');
- var format = require('util').format;
- var _ = require('underscore');
-
-
- var Action = require('../action');
-
-
- var $$ = require('../const');
-
-
- var argumentErrorHelper = require('../argument/error');
-
-
-
- var ChoicesPseudoAction = function (name, help) {
- var options = {
- optionStrings: [],
- dest: name,
- help: help
- };
-
- Action.call(this, options);
- };
- util.inherits(ChoicesPseudoAction, Action);
-
-
- var ActionSubparsers = module.exports = function ActionSubparsers(options) {
- options = options || {};
- options.dest = options.dest || $$.SUPPRESS;
- options.nargs = $$.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);
-
-
- ActionSubparsers.prototype.addParser = function (name, options) {
- var parser;
-
- var self = this;
-
- options = options || {};
-
- options.debug = (this.debug === true);
-
-
- if (!options.prog) {
- options.prog = this._progPrefix + ' ' + name;
- }
-
- var aliases = options.aliases || [];
-
-
- if (!!options.help || _.isString(options.help)) {
- var help = options.help;
- delete options.help;
-
- var choiceAction = new ChoicesPseudoAction(name, help);
- this._choicesActions.push(choiceAction);
- }
-
-
- parser = new this._parserClass(options);
- this._nameParserMap[name] = parser;
-
-
- aliases.forEach(function (alias) {
- self._nameParserMap[alias] = parser;
- });
-
- return parser;
- };
-
- ActionSubparsers.prototype._getSubactions = function () {
- return this._choicesActions;
- };
-
-
- ActionSubparsers.prototype.call = function (parser, namespace, values) {
- var parserName = values[0];
- var argStrings = values.slice(1);
-
-
- if (this.dest !== $$.SUPPRESS) {
- namespace[this.dest] = parserName;
- }
-
-
- if (!!this._nameParserMap[parserName]) {
- parser = this._nameParserMap[parserName];
- } else {
- throw argumentErrorHelper(format(
- 'Unknown parser "%s" (choices: [%s]).',
- parserName,
- _.keys(this._nameParserMap).join(', ')
- ));
- }
-
-
- parser.parseArgs(argStrings, namespace);
- };
-
|