blob: 1483c79ffa53d6537fbae068987e39a50e2cfa08 [file] [log] [blame]
Kaido Kertf585e262020-06-08 11:42:28 -07001/**
2 * class Action
3 *
4 * Base class for all actions
5 * Do not call in your code, use this class only for inherits your own action
6 *
7 * Information about how to convert command line strings to Javascript objects.
8 * Action objects are used by an ArgumentParser to represent the information
9 * needed to parse a single argument from one or more strings from the command
10 * line. The keyword arguments to the Action constructor are also all attributes
11 * of Action instances.
12 *
13 * ##### Allowed keywords:
14 *
15 * - `store`
16 * - `storeConstant`
17 * - `storeTrue`
18 * - `storeFalse`
19 * - `append`
20 * - `appendConstant`
21 * - `count`
22 * - `help`
23 * - `version`
24 *
25 * Information about action options see [[Action.new]]
26 *
27 * See also [original guide](http://docs.python.org/dev/library/argparse.html#action)
28 *
29 **/
30
31'use strict';
32
33
34// Constants
35var c = require('./const');
36
37
38/**
39 * new Action(options)
40 *
41 * Base class for all actions. Used only for inherits
42 *
43 *
44 * ##### Options:
45 *
46 * - `optionStrings` A list of command-line option strings for the action.
47 * - `dest` Attribute to hold the created object(s)
48 * - `nargs` The number of command-line arguments that should be consumed.
49 * By default, one argument will be consumed and a single value will be
50 * produced.
51 * - `constant` Default value for an action with no value.
52 * - `defaultValue` The value to be produced if the option is not specified.
53 * - `type` Cast to 'string'|'int'|'float'|'complex'|function (string). If
54 * None, 'string'.
55 * - `choices` The choices available.
56 * - `required` True if the action must always be specified at the command
57 * line.
58 * - `help` The help describing the argument.
59 * - `metavar` The name to be used for the option's argument with the help
60 * string. If None, the 'dest' value will be used as the name.
61 *
62 * ##### nargs supported values:
63 *
64 * - `N` (an integer) consumes N arguments (and produces a list)
65 * - `?` consumes zero or one arguments
66 * - `*` consumes zero or more arguments (and produces a list)
67 * - `+` consumes one or more arguments (and produces a list)
68 *
69 * Note: that the difference between the default and nargs=1 is that with the
70 * default, a single value will be produced, while with nargs=1, a list
71 * containing a single value will be produced.
72 **/
73var Action = module.exports = function Action(options) {
74 options = options || {};
75 this.optionStrings = options.optionStrings || [];
76 this.dest = options.dest;
77 this.nargs = typeof options.nargs !== 'undefined' ? options.nargs : null;
78 this.constant = typeof options.constant !== 'undefined' ? options.constant : null;
79 this.defaultValue = options.defaultValue;
80 this.type = typeof options.type !== 'undefined' ? options.type : null;
81 this.choices = typeof options.choices !== 'undefined' ? options.choices : null;
82 this.required = typeof options.required !== 'undefined' ? options.required : false;
83 this.help = typeof options.help !== 'undefined' ? options.help : null;
84 this.metavar = typeof options.metavar !== 'undefined' ? options.metavar : null;
85
86 if (!(this.optionStrings instanceof Array)) {
87 throw new Error('optionStrings should be an array');
88 }
89 if (typeof this.required !== 'undefined' && typeof this.required !== 'boolean') {
90 throw new Error('required should be a boolean');
91 }
92};
93
94/**
95 * Action#getName -> String
96 *
97 * Tells action name
98 **/
99Action.prototype.getName = function () {
100 if (this.optionStrings.length > 0) {
101 return this.optionStrings.join('/');
102 } else if (this.metavar !== null && this.metavar !== c.SUPPRESS) {
103 return this.metavar;
104 } else if (typeof this.dest !== 'undefined' && this.dest !== c.SUPPRESS) {
105 return this.dest;
106 }
107 return null;
108};
109
110/**
111 * Action#isOptional -> Boolean
112 *
113 * Return true if optional
114 **/
115Action.prototype.isOptional = function () {
116 return !this.isPositional();
117};
118
119/**
120 * Action#isPositional -> Boolean
121 *
122 * Return true if positional
123 **/
124Action.prototype.isPositional = function () {
125 return (this.optionStrings.length === 0);
126};
127
128/**
129 * Action#call(parser, namespace, values, optionString) -> Void
130 * - parser (ArgumentParser): current parser
131 * - namespace (Namespace): namespace for output data
132 * - values (Array): parsed values
133 * - optionString (Array): input option string(not parsed)
134 *
135 * Call the action. Should be implemented in inherited classes
136 *
137 * ##### Example
138 *
139 * ActionCount.prototype.call = function (parser, namespace, values, optionString) {
140 * namespace.set(this.dest, (namespace[this.dest] || 0) + 1);
141 * };
142 *
143 **/
144Action.prototype.call = function () {
145 throw new Error('.call() not defined');// Not Implemented error
146};