This repository has been archived by the owner on Oct 17, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 63
/
arg_results.dart
151 lines (130 loc) · 4.91 KB
/
arg_results.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:collection';
import 'arg_parser.dart';
/// Creates a new [ArgResults].
///
/// Since [ArgResults] doesn't have a public constructor, this lets [ArgParser]
/// get to it. This function isn't exported to the public API of the package.
ArgResults newArgResults(
ArgParser parser,
Map<String, dynamic> parsed,
String? name,
ArgResults? command,
List<String> rest,
List<String> arguments) {
return ArgResults._(parser, parsed, name, command, rest, arguments);
}
/// The results of parsing a series of command line arguments using
/// [ArgParser.parse].
///
/// Includes the parsed options and any remaining unparsed command line
/// arguments.
class ArgResults {
/// The [ArgParser] whose options were parsed for these results.
final ArgParser _parser;
/// The option values that were parsed from arguments.
final Map<String, dynamic> _parsed;
/// The name of the command for which these options are parsed, or `null` if
/// these are the top-level results.
final String? name;
/// The command that was selected, or `null` if none was.
///
/// This will contain the options that were selected for that command.
final ArgResults? command;
/// The remaining command-line arguments that were not parsed as options or
/// flags.
///
/// If `--` was used to separate the options from the remaining arguments,
/// it will not be included in this list unless parsing stopped before the
/// `--` was reached.
final List<String> rest;
/// The original arguments that were parsed.
final List<String> arguments;
ArgResults._(this._parser, this._parsed, this.name, this.command,
List<String> rest, List<String> arguments)
: rest = UnmodifiableListView(rest),
arguments = UnmodifiableListView(arguments);
/// Returns the parsed or default command-line option named [name].
///
/// [name] must be a valid option name in the parser.
///
/// > [!Note]
/// > Callers should prefer using the more strongly typed methods - [flag] for
/// > flags, [option] for options, and [multiOption] for multi-options.
dynamic operator [](String name) {
if (!_parser.options.containsKey(name)) {
throw ArgumentError('Could not find an option named "--$name".');
}
final option = _parser.options[name]!;
if (option.mandatory && !_parsed.containsKey(name)) {
throw ArgumentError('Option $name is mandatory.');
}
return option.valueOrDefault(_parsed[name]);
}
/// Returns the parsed or default command-line flag named [name].
///
/// [name] must be a valid flag name in the parser.
bool flag(String name) {
var option = _parser.options[name];
if (option == null) {
throw ArgumentError('Could not find an option named "--$name".');
}
if (!option.isFlag) {
throw ArgumentError('"$name" is not a flag.');
}
return option.valueOrDefault(_parsed[name]) as bool;
}
/// Returns the parsed or default command-line option named [name].
///
/// [name] must be a valid option name in the parser.
String? option(String name) {
var option = _parser.options[name];
if (option == null) {
throw ArgumentError('Could not find an option named "--$name".');
}
if (!option.isSingle) {
throw ArgumentError('"$name" is a multi-option.');
}
return option.valueOrDefault(_parsed[name]) as String?;
}
/// Returns the list of parsed (or default) command-line options for [name].
///
/// [name] must be a valid option name in the parser.
List<String> multiOption(String name) {
var option = _parser.options[name];
if (option == null) {
throw ArgumentError('Could not find an option named "--$name".');
}
if (!option.isMultiple) {
throw ArgumentError('"$name" is not a multi-option.');
}
return option.valueOrDefault(_parsed[name]) as List<String>;
}
/// The names of the available options.
///
/// Includes the options whose values were parsed or that have defaults.
/// Options that weren't present and have no default are omitted.
Iterable<String> get options {
var result = _parsed.keys.toSet();
// Include the options that have defaults.
_parser.options.forEach((name, option) {
if (option.defaultsTo != null) result.add(name);
});
return result;
}
/// Returns `true` if the option with [name] was parsed from an actual
/// argument.
///
/// Returns `false` if it wasn't provided and the default value or no default
/// value would be used instead.
///
/// [name] must be a valid option name in the parser.
bool wasParsed(String name) {
if (!_parser.options.containsKey(name)) {
throw ArgumentError('Could not find an option named "--$name".');
}
return _parsed.containsKey(name);
}
}