Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 Parses raw command-line arguments into a set of options and values. | 1 Parses raw command-line arguments into a set of options and values. |
| 2 | 2 |
| 3 This library supports [GNU][] and [POSIX][] style options, and it works | 3 This library supports [GNU][] and [POSIX][] style options, and it works |
| 4 in both server-side and client-side apps. | 4 in both server-side and client-side apps. |
| 5 | 5 |
| 6 ## Defining options | 6 ## Defining options |
| 7 | 7 |
| 8 First create an [ArgParser][]: | 8 First create an [ArgParser][]: |
| 9 | 9 |
| 10 var parser = new ArgParser(); | 10 var parser = new ArgParser(); |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 190 command.addFlag('all', abbr: 'a'); | 190 command.addFlag('all', abbr: 'a'); |
| 191 | 191 |
| 192 var results = parser.parse(['commit', '-a']); | 192 var results = parser.parse(['commit', '-a']); |
| 193 print(results.command['all']); // true | 193 print(results.command['all']); // true |
| 194 | 194 |
| 195 Here, both the top-level parser and the `"commit"` command can accept a `"-a"` | 195 Here, both the top-level parser and the `"commit"` command can accept a `"-a"` |
| 196 (which is probably a bad command line interface, admittedly). In that case, when | 196 (which is probably a bad command line interface, admittedly). In that case, when |
| 197 `"-a"` appears after `"commit"`, it is applied to that command. If it appears to | 197 `"-a"` appears after `"commit"`, it is applied to that command. If it appears to |
| 198 the left of `"commit"`, it is given to the top-level parser. | 198 the left of `"commit"`, it is given to the top-level parser. |
| 199 | 199 |
| 200 ## Dispatching Commands | |
| 201 | |
| 202 If you're writing a command-based application, you can use the [CommandRunner][] | |
| 203 and [Command][] classes to help structure it. [CommandRunner][] has built-in | |
| 204 support for dispatching to [Command][]s based on command-line arguments, as well | |
| 205 as handling `--help` flags and invalid arguments. For example: | |
| 206 | |
| 207 var runner = new CommandRunner("git", "Distributed version control."); | |
| 208 runner.addCommand(new CommitCommand()); | |
| 209 runner.addCommand(new StashCommand()); | |
| 210 runner.run(['commit', '-a']); // Calls [CommitCommand.run()] | |
| 211 | |
| 212 Custom commands are defined by extending the [Command][] class. For example: | |
| 213 | |
| 214 class CommitCommand extends Command { | |
| 215 // The [name] and [description] fields must be set by every subclass. | |
|
Bob Nystrom
2014/12/11 20:25:30
This is confusing. You aren't setting fields here,
nweiz
2014/12/11 23:55:24
Changed "set" to "defined". I still find defining
Bob Nystrom
2014/12/12 18:13:22
That still isn't correct. Subclasses don't have to
nweiz
2014/12/16 02:07:44
Changed to "property" which matches dartdoc.
Bob Nystrom
2014/12/16 16:50:41
Property is perfect, thanks. I just don't want use
| |
| 216 final String name = "commit"; | |
| 217 final String description = "Record changes to the repository."; | |
| 218 | |
| 219 CommitCommand() { | |
| 220 // [argParser] is automatically created by the parent class. | |
| 221 argParser.addFlag('all', abbr: 'a'); | |
| 222 } | |
| 223 | |
| 224 void run() { | |
|
Bob Nystrom
2014/12/11 20:25:30
It would be good to mention how asynchrony is hand
nweiz
2014/12/11 23:55:24
Done.
| |
| 225 // [options] is set before [run()] is called and contains the options | |
| 226 // passed to this command. | |
| 227 print(options['all']); | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 Commands can also have subcommands, which are added with [addSubcommand][]. A | |
| 232 command with subcommands can't run its own code, so [run][] doesn't need to be | |
|
Bob Nystrom
2014/12/11 20:25:30
Why can't parent commands also be run?
nweiz
2014/12/11 23:55:24
Because the pub command runner didn't support it a
Bob Nystrom
2014/12/12 18:13:22
This CL isn't urgent, though, is it?
I could be w
nweiz
2014/12/16 02:07:43
Well, it's blocking further work on the developmen
Bob Nystrom
2014/12/16 16:50:41
I was thinking it might make it more natural for C
| |
| 233 implemented. For example: | |
| 234 | |
| 235 class StashCommand extends Command { | |
| 236 final String name = "stash"; | |
| 237 final String description = "Stash changes in the working directory."; | |
| 238 | |
| 239 StashCommand() { | |
| 240 addSubcommand(new StashSaveCommand()); | |
| 241 addSubcommand(new StashListCommand()); | |
| 242 } | |
| 243 } | |
| 244 | |
| 245 [CommandRunner][] will automatically add a `help` command that displays usage | |
|
Bob Nystrom
2014/12/11 20:25:30
Present tense.
nweiz
2014/12/11 23:55:23
Done.
| |
| 246 information for commands, as well as support for the `--help` flag for all | |
| 247 commands. If it encounters an error parsing the arguments or processing a | |
| 248 command, it will throw a [UsageError][]; the `main()` method should catch these | |
|
Bob Nystrom
2014/12/11 20:25:30
"the" -> "your".
nweiz
2014/12/11 23:55:24
Done.
| |
| 249 and print them appropriately. For example: | |
| 250 | |
| 251 runner.run(arguments).catchError((error) { | |
| 252 if (error is! UsageError) throw error; | |
| 253 print(error); | |
| 254 exit(64); // Exit code 64 indicates a usage error. | |
| 255 }); | |
| 256 | |
| 200 ## Displaying usage | 257 ## Displaying usage |
| 201 | 258 |
| 202 You can automatically generate nice help text, suitable for use as the output of | 259 You can automatically generate nice help text, suitable for use as the output of |
| 203 `--help`. To display good usage information, you should provide some help text | 260 `--help`. To display good usage information, you should provide some help text |
| 204 when you create your options. | 261 when you create your options. |
| 205 | 262 |
| 206 To define help text for an entire option, use the `help:` parameter: | 263 To define help text for an entire option, use the `help:` parameter: |
| 207 | 264 |
| 208 parser.addOption('mode', help: 'The compiler configuration', | 265 parser.addOption('mode', help: 'The compiler configuration', |
| 209 allowed: ['debug', 'release']); | 266 allowed: ['debug', 'release']); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 233 [debug, release] | 290 [debug, release] |
| 234 | 291 |
| 235 --out=<path> The output path | 292 --out=<path> The output path |
| 236 --[no-]verbose Show additional diagnostic info | 293 --[no-]verbose Show additional diagnostic info |
| 237 --arch The architecture to compile for | 294 --arch The architecture to compile for |
| 238 [arm] ARM Holding 32-bit chip | 295 [arm] ARM Holding 32-bit chip |
| 239 [ia32] Intel x86 | 296 [ia32] Intel x86 |
| 240 | 297 |
| 241 [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html #tag_12_02 | 298 [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html #tag_12_02 |
| 242 [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfa ces | 299 [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfa ces |
| 243 [ArgParser]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/arg s/args.ArgParser | 300 [ArgParser]: http://www.dartdocs.org/documentation/args/latest/index.html#args/a rgs.ArgParser |
| 244 [ArgResults]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/ar gs/args.ArgResults | 301 [ArgResults]: http://www.dartdocs.org/documentation/args/latest/index.html#args/ args.ArgResults |
| 245 [addOption]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/arg s/args.ArgParser#id_addOption | 302 [CommandRunner]: http://www.dartdocs.org/documentation/args/latest/index.html#ar gs/args.CommandRunner |
| 246 [addFlag]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/ args.ArgParser#id_addFlag | 303 [Command]: http://www.dartdocs.org/documentation/args/latest/index.html#args/arg s.Command |
| 247 [parse]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/ar gs.ArgParser#id_parse | 304 [UsageError]: http://www.dartdocs.org/documentation/args/latest/index.html#args/ args.UsageError |
| 248 [rest]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args/arg s.ArgResults#id_rest | 305 [addOption]: http://www.dartdocs.org/documentation/args/latest/index.html#args/a rgs.ArgParser@id_addOption |
| 249 [addCommand]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/ar gs/args.ArgParser#id_addCommand | 306 [addFlag]: http://www.dartdocs.org/documentation/args/latest/index.html#args/arg s.ArgParser@id_addFlag |
| 250 [getUsage]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/args /args.ArgParser#id_getUsage | 307 [parse]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args. ArgParser@id_parse |
| 308 [rest]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.A rgResults@id_rest | |
| 309 [addCommand]: http://www.dartdocs.org/documentation/args/latest/index.html#args/ args.ArgParser@id_addCommand | |
| 310 [getUsage]: http://www.dartdocs.org/documentation/args/latest/index.html#args/ar gs.ArgParser@id_getUsage | |
| 311 [addSubcommand]: http://www.dartdocs.org/documentation/args/latest/index.html#ar gs/args.Command@id_addSubcommand | |
| 312 [run]: http://www.dartdocs.org/documentation/args/latest/index.html#args/args.Co mmand@id_run | |
| OLD | NEW |