Skip to content

Commit a6b3634

Browse files
authored
Introduce new typed ArgResults flag(String), option(String), and multiOption(String) methods (dart-archive/args#248)
* introduce types methods to ArgResults * rename methods * updates * review feedback * reduce PR diffs * reduce PR diffs * review feedback * Update arg_results.dart
1 parent 14a8be0 commit a6b3634

File tree

7 files changed

+258
-22
lines changed

7 files changed

+258
-22
lines changed

pkgs/args/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.5.0-wip
2+
3+
* Introduce new typed `ArgResults` `flag(String)`, `option(String)`, and
4+
`multiOption(String)` methods.
5+
16
## 2.4.2
27

38
* Change the validation of `mandatory` options; they now perform validation when

pkgs/args/README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ parser.addOption('mode');
111111
parser.addFlag('verbose', defaultsTo: true);
112112
var results = parser.parse(['--mode', 'debug', 'something', 'else']);
113113
114-
print(results['mode']); // debug
115-
print(results['verbose']); // true
114+
print(results.option('mode')); // debug
115+
print(results.flag('verbose')); // true
116116
```
117117

118118
By default, the `parse()` method allows additional flags and options to be
@@ -187,7 +187,7 @@ overriding earlier ones; for example:
187187
var parser = ArgParser();
188188
parser.addOption('mode');
189189
var results = parser.parse(['--mode', 'on', '--mode', 'off']);
190-
print(results['mode']); // prints 'off'
190+
print(results.option('mode')); // prints 'off'
191191
```
192192

193193
Multiple values can be parsed with `addMultiOption()`. With this method, an
@@ -198,7 +198,7 @@ values:
198198
var parser = ArgParser();
199199
parser.addMultiOption('mode');
200200
var results = parser.parse(['--mode', 'on', '--mode', 'off']);
201-
print(results['mode']); // prints '[on, off]'
201+
print(results.multiOption('mode')); // prints '[on, off]'
202202
```
203203

204204
By default, values for a multi-valued option may also be separated with commas:
@@ -207,7 +207,7 @@ By default, values for a multi-valued option may also be separated with commas:
207207
var parser = ArgParser();
208208
parser.addMultiOption('mode');
209209
var results = parser.parse(['--mode', 'on,off']);
210-
print(results['mode']); // prints '[on, off]'
210+
print(results.multiOption('mode')); // prints '[on, off]'
211211
```
212212

213213
This can be disabled by passing `splitCommas: false`.
@@ -326,7 +326,7 @@ class CommitCommand extends Command {
326326
void run() {
327327
// [argResults] is set before [run()] is called and contains the flags/options
328328
// passed to this command.
329-
print(argResults['all']);
329+
print(argResults.flag('all'));
330330
}
331331
}
332332
```

pkgs/args/example/command_runner/draw.dart

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class SquareCommand extends Command<String> {
3333

3434
@override
3535
FutureOr<String>? run() {
36-
final size = int.parse(argResults?['size'] as String? ?? '20');
37-
final char = (globalResults?['char'] as String?)?[0] ?? '#';
36+
final size = int.parse(argResults?.option('size') ?? '20');
37+
final char = globalResults?.option('char')?[0] ?? '#';
3838
return draw(size, size, char, (x, y) => true);
3939
}
4040
}
@@ -55,8 +55,8 @@ class CircleCommand extends Command<String> {
5555

5656
@override
5757
FutureOr<String>? run() {
58-
final size = 2 * int.parse(argResults?['radius'] as String? ?? '10');
59-
final char = (globalResults?['char'] as String?)?[0] ?? '#';
58+
final size = 2 * int.parse(argResults?.option('radius') ?? '10');
59+
final char = globalResults?.option('char')?[0] ?? '#';
6060
return draw(size, size, char, (x, y) => x * x + y * y < 1);
6161
}
6262
}
@@ -93,8 +93,8 @@ class EquilateralTriangleCommand extends Command<String> {
9393

9494
@override
9595
FutureOr<String>? run() {
96-
final size = int.parse(argResults?['size'] as String? ?? '20');
97-
final char = (globalResults?['char'] as String?)?[0] ?? '#';
96+
final size = int.parse(argResults?.option('size') ?? '20');
97+
final char = globalResults?.option('char')?[0] ?? '#';
9898
return drawTriangle(size, size * sqrt(3) ~/ 2, char);
9999
}
100100
}
@@ -116,9 +116,9 @@ class IsoscelesTriangleCommand extends Command<String> {
116116

117117
@override
118118
FutureOr<String>? run() {
119-
final width = int.parse(argResults?['width'] as String? ?? '50');
120-
final height = int.parse(argResults?['height'] as String? ?? '10');
121-
final char = (globalResults?['char'] as String?)?[0] ?? '#';
119+
final width = int.parse(argResults?.option('width') ?? '50');
120+
final height = int.parse(argResults?.option('height') ?? '10');
121+
final char = globalResults?.option('char')?[0] ?? '#';
122122
return drawTriangle(width, height, char);
123123
}
124124
}

pkgs/args/lib/command_runner.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,13 @@ class CommandRunner<T> {
192192
commands = command._subcommands as Map<String, Command<T>>;
193193
commandString += ' ${argResults.name}';
194194

195-
if (argResults.options.contains('help') && (argResults['help'] as bool)) {
195+
if (argResults.options.contains('help') && argResults.flag('help')) {
196196
command.printUsage();
197197
return null;
198198
}
199199
}
200200

201-
if (topLevelResults['help'] as bool) {
201+
if (topLevelResults.flag('help')) {
202202
command!.printUsage();
203203
return null;
204204
}

pkgs/args/lib/src/arg_results.dart

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ ArgResults newArgResults(
2121
}
2222

2323
/// The results of parsing a series of command line arguments using
24-
/// [ArgParser.parse()].
24+
/// [ArgParser.parse].
2525
///
2626
/// Includes the parsed options and any remaining unparsed command line
2727
/// arguments.
@@ -57,9 +57,13 @@ class ArgResults {
5757
: rest = UnmodifiableListView(rest),
5858
arguments = UnmodifiableListView(arguments);
5959

60-
/// Returns the parsed ore default command-line option named [name].
60+
/// Returns the parsed or default command-line option named [name].
6161
///
6262
/// [name] must be a valid option name in the parser.
63+
///
64+
/// > [!Note]
65+
/// > Callers should prefer using the more strongly typed methods - [flag] for
66+
/// > flags, [option] for options, and [multiOption] for multi-options.
6367
dynamic operator [](String name) {
6468
if (!_parser.options.containsKey(name)) {
6569
throw ArgumentError('Could not find an option named "$name".');
@@ -73,6 +77,48 @@ class ArgResults {
7377
return option.valueOrDefault(_parsed[name]);
7478
}
7579

80+
/// Returns the parsed or default command-line flag named [name].
81+
///
82+
/// [name] must be a valid flag name in the parser.
83+
bool flag(String name) {
84+
var option = _parser.options[name];
85+
if (option == null) {
86+
throw ArgumentError('Could not find an option named "$name".');
87+
}
88+
if (!option.isFlag) {
89+
throw ArgumentError('"$name" is not a flag.');
90+
}
91+
return option.valueOrDefault(_parsed[name]) as bool;
92+
}
93+
94+
/// Returns the parsed or default command-line option named [name].
95+
///
96+
/// [name] must be a valid option name in the parser.
97+
String? option(String name) {
98+
var option = _parser.options[name];
99+
if (option == null) {
100+
throw ArgumentError('Could not find an option named "$name".');
101+
}
102+
if (!option.isSingle) {
103+
throw ArgumentError('"$name" is a multi-option.');
104+
}
105+
return option.valueOrDefault(_parsed[name]) as String?;
106+
}
107+
108+
/// Returns the list of parsed (or default) command-line options for [name].
109+
///
110+
/// [name] must be a valid option name in the parser.
111+
List<String> multiOption(String name) {
112+
var option = _parser.options[name];
113+
if (option == null) {
114+
throw ArgumentError('Could not find an option named "$name".');
115+
}
116+
if (!option.isMultiple) {
117+
throw ArgumentError('"$name" is not a multi-option.');
118+
}
119+
return option.valueOrDefault(_parsed[name]) as List<String>;
120+
}
121+
76122
/// The names of the available options.
77123
///
78124
/// Includes the options whose values were parsed or that have defaults.

pkgs/args/pubspec.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
name: args
2-
version: 2.4.2
2+
version: 2.5.0-wip
33
description: >-
4-
Library for defining parsers for parsing raw command-line arguments into a set
5-
of options and values using GNU and POSIX style options.
4+
Library for defining parsers for parsing raw command-line arguments into a set
5+
of options and values using GNU and POSIX style options.
66
repository: https://github.com/dart-lang/args
77

88
topics:

0 commit comments

Comments
 (0)