| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /** | 5 /** |
| 6 * Parser support for transforming raw command-line arguments into a set | 6 * Parser support for transforming raw command-line arguments into a set |
| 7 * of options and values. | 7 * of options and values. |
| 8 * | 8 * |
| 9 * This library supports [GNU][] and [POSIX][] style options, and it works | 9 * This library supports [GNU][] and [POSIX][] style options, and it works |
| 10 * in both server-side and client-side apps. | 10 * in both server-side and client-side apps. |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 /** | 279 /** |
| 280 * The options that have been defined for this parser. | 280 * The options that have been defined for this parser. |
| 281 */ | 281 */ |
| 282 final Map<String, Option> options; | 282 final Map<String, Option> options; |
| 283 | 283 |
| 284 /** | 284 /** |
| 285 * The commands that have been defined for this parser. | 285 * The commands that have been defined for this parser. |
| 286 */ | 286 */ |
| 287 final Map<String, ArgParser> commands; | 287 final Map<String, ArgParser> commands; |
| 288 | 288 |
| 289 /** Creates a new ArgParser. */ | 289 /** |
| 290 factory ArgParser() => | 290 * Whether or not this parser parses options that appear after non-option |
| 291 new ArgParser._(<String, Option>{}, <String, ArgParser>{}); | 291 * arguments. |
| 292 */ |
| 293 final bool allowTrailingOptions; |
| 292 | 294 |
| 293 ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands) : | 295 /** |
| 296 * Creates a new ArgParser. |
| 297 * |
| 298 * If [allowTrailingOptions] is set, the parser will continue parsing even |
| 299 * after it finds an argument that is neither an option nor a command. |
| 300 * This allows options to be specified after regular arguments. Defaults to |
| 301 * `false`. |
| 302 */ |
| 303 factory ArgParser({bool allowTrailingOptions}) => |
| 304 new ArgParser._(<String, Option>{}, <String, ArgParser>{}, |
| 305 allowTrailingOptions: allowTrailingOptions); |
| 306 |
| 307 ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands, |
| 308 {bool allowTrailingOptions}) : |
| 294 this._options = options, | 309 this._options = options, |
| 295 this.options = new UnmodifiableMapView(options), | 310 this.options = new UnmodifiableMapView(options), |
| 296 this._commands = commands, | 311 this._commands = commands, |
| 297 this.commands = new UnmodifiableMapView(commands); | 312 this.commands = new UnmodifiableMapView(commands), |
| 313 this.allowTrailingOptions = allowTrailingOptions != null ? |
| 314 allowTrailingOptions : false; |
| 298 | 315 |
| 299 /** | 316 /** |
| 300 * Defines a command. | 317 * Defines a command. |
| 301 * | 318 * |
| 302 * A command is a named argument which may in turn define its own options and | 319 * A command is a named argument which may in turn define its own options and |
| 303 * subcommands using the given parser. If [parser] is omitted, implicitly | 320 * subcommands using the given parser. If [parser] is omitted, implicitly |
| 304 * creates a new one. Returns the parser for the command. | 321 * creates a new one. Returns the parser for the command. |
| 305 */ | 322 */ |
| 306 ArgParser addCommand(String name, [ArgParser parser]) { | 323 ArgParser addCommand(String name, [ArgParser parser]) { |
| 307 // Make sure the name isn't in use. | 324 // Make sure the name isn't in use. |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 359 } | 376 } |
| 360 | 377 |
| 361 _options[name] = new Option(name, abbr, help, allowed, allowedHelp, | 378 _options[name] = new Option(name, abbr, help, allowed, allowedHelp, |
| 362 defaultsTo, callback, isFlag: isFlag, negatable: negatable, | 379 defaultsTo, callback, isFlag: isFlag, negatable: negatable, |
| 363 allowMultiple: allowMultiple, hide: hide); | 380 allowMultiple: allowMultiple, hide: hide); |
| 364 } | 381 } |
| 365 | 382 |
| 366 /** | 383 /** |
| 367 * Parses [args], a list of command-line arguments, matches them against the | 384 * Parses [args], a list of command-line arguments, matches them against the |
| 368 * flags and options defined by this parser, and returns the result. | 385 * flags and options defined by this parser, and returns the result. |
| 369 * | |
| 370 * If [allowTrailingOptions] is set, the parser will continue parsing even | |
| 371 * after it finds an argument that is neither an option nor a command. | |
| 372 * This allows options to be specified after regular arguments. | |
| 373 * | |
| 374 * [allowTrailingOptions] is false by default, so when a non-option, | |
| 375 * non-command argument is encountered, it and all remaining arguments, | |
| 376 * even those that look like options are passed to the innermost command. | |
| 377 */ | 386 */ |
| 378 ArgResults parse(List<String> args, {bool allowTrailingOptions}) { | 387 ArgResults parse(List<String> args) => |
| 379 if (allowTrailingOptions == null) allowTrailingOptions = false; | 388 new Parser(null, this, args.toList(), null, null).parse(); |
| 380 return new Parser(null, this, args.toList(), null, null, | |
| 381 allowTrailingOptions: allowTrailingOptions).parse(); | |
| 382 } | |
| 383 | 389 |
| 384 /** | 390 /** |
| 385 * Generates a string displaying usage information for the defined options. | 391 * Generates a string displaying usage information for the defined options. |
| 386 * This is basically the help text shown on the command line. | 392 * This is basically the help text shown on the command line. |
| 387 */ | 393 */ |
| 388 String getUsage() => new Usage(this).generate(); | 394 String getUsage() => new Usage(this).generate(); |
| 389 | 395 |
| 390 /** | 396 /** |
| 391 * Get the default value for an option. Useful after parsing to test | 397 * Get the default value for an option. Useful after parsing to test |
| 392 * if the user specified something other than the default. | 398 * if the user specified something other than the default. |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 'Could not find an option named "$name".'); | 452 'Could not find an option named "$name".'); |
| 447 } | 453 } |
| 448 | 454 |
| 449 return _options[name]; | 455 return _options[name]; |
| 450 } | 456 } |
| 451 | 457 |
| 452 /** Get the names of the options as an [Iterable]. */ | 458 /** Get the names of the options as an [Iterable]. */ |
| 453 Iterable<String> get options => _options.keys; | 459 Iterable<String> get options => _options.keys; |
| 454 } | 460 } |
| 455 | 461 |
| OLD | NEW |