| 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 * This library lets you define parsers for parsing raw command-line arguments | 6 * This library lets you define parsers for parsing raw command-line arguments |
| 7 * into a set of options and values using [GNU][] and [POSIX][] style options. | 7 * into a set of options and values using [GNU][] and [POSIX][] style options. |
| 8 * | 8 * |
| 9 * ## Installing ## | 9 * ## Installing ## |
| 10 * | 10 * |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 250 * options. | 250 * options. |
| 251 * | 251 * |
| 252 * [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.h
tml#tag_12_02 | 252 * [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.h
tml#tag_12_02 |
| 253 * [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Inte
rfaces | 253 * [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Inte
rfaces |
| 254 * [pub]: http://pub.dartlang.org | 254 * [pub]: http://pub.dartlang.org |
| 255 */ | 255 */ |
| 256 library args; | 256 library args; |
| 257 | 257 |
| 258 import 'src/parser.dart'; | 258 import 'src/parser.dart'; |
| 259 import 'src/usage.dart'; | 259 import 'src/usage.dart'; |
| 260 import 'src/options.dart'; |
| 261 export 'src/options.dart'; |
| 260 | 262 |
| 261 /** | 263 /** |
| 262 * A class for taking a list of raw command line arguments and parsing out | 264 * A class for taking a list of raw command line arguments and parsing out |
| 263 * options and flags from them. | 265 * options and flags from them. |
| 264 */ | 266 */ |
| 265 class ArgParser { | 267 class ArgParser { |
| 266 /** | 268 /** |
| 267 * The options that have been defined for this parser. | 269 * The options that have been defined for this parser. |
| 268 */ | 270 */ |
| 269 final Map<String, Option> options = <String, Option>{}; | 271 final Map<String, Option> options = <String, Option>{}; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 * Finds the option whose abbreviation is [abbr], or `null` if no option has | 372 * Finds the option whose abbreviation is [abbr], or `null` if no option has |
| 371 * that abbreviation. | 373 * that abbreviation. |
| 372 */ | 374 */ |
| 373 Option findByAbbreviation(String abbr) { | 375 Option findByAbbreviation(String abbr) { |
| 374 return options.values.firstWhere((option) => option.abbreviation == abbr, | 376 return options.values.firstWhere((option) => option.abbreviation == abbr, |
| 375 orElse: () => null); | 377 orElse: () => null); |
| 376 } | 378 } |
| 377 } | 379 } |
| 378 | 380 |
| 379 /** | 381 /** |
| 380 * A command-line option. Includes both flags and options which take a value. | |
| 381 */ | |
| 382 class Option { | |
| 383 final String name; | |
| 384 final String abbreviation; | |
| 385 final List<String> allowed; | |
| 386 final defaultValue; | |
| 387 final Function callback; | |
| 388 final String help; | |
| 389 final Map<String, String> allowedHelp; | |
| 390 final bool isFlag; | |
| 391 final bool negatable; | |
| 392 final bool allowMultiple; | |
| 393 | |
| 394 Option(this.name, this.abbreviation, this.help, this.allowed, | |
| 395 this.allowedHelp, this.defaultValue, this.callback, {this.isFlag, | |
| 396 this.negatable, this.allowMultiple: false}) { | |
| 397 | |
| 398 if (name.isEmpty) { | |
| 399 throw new ArgumentError('Name cannot be empty.'); | |
| 400 } else if (name.startsWith('-')) { | |
| 401 throw new ArgumentError('Name $name cannot start with "-".'); | |
| 402 } | |
| 403 | |
| 404 // Ensure name does not contain any invalid characters. | |
| 405 if (_invalidChars.hasMatch(name)) { | |
| 406 throw new ArgumentError('Name "$name" contains invalid characters.'); | |
| 407 } | |
| 408 | |
| 409 if (abbreviation != null) { | |
| 410 if (abbreviation.length != 1) { | |
| 411 throw new ArgumentError('Abbreviation must be null or have length 1.'); | |
| 412 } else if(abbreviation == '-') { | |
| 413 throw new ArgumentError('Abbreviation cannot be "-".'); | |
| 414 } | |
| 415 | |
| 416 if (_invalidChars.hasMatch(abbreviation)) { | |
| 417 throw new ArgumentError('Abbreviation is an invalid character.'); | |
| 418 } | |
| 419 } | |
| 420 } | |
| 421 | |
| 422 static final _invalidChars = new RegExp(r'''[ \t\r\n"'\\/]'''); | |
| 423 } | |
| 424 | |
| 425 /** | |
| 426 * The results of parsing a series of command line arguments using | 382 * The results of parsing a series of command line arguments using |
| 427 * [ArgParser.parse()]. Includes the parsed options and any remaining unparsed | 383 * [ArgParser.parse()]. Includes the parsed options and any remaining unparsed |
| 428 * command line arguments. | 384 * command line arguments. |
| 429 */ | 385 */ |
| 430 class ArgResults { | 386 class ArgResults { |
| 431 final Map _options; | 387 final Map _options; |
| 432 | 388 |
| 433 /** | 389 /** |
| 434 * If these are the results for parsing a command's options, this will be | 390 * If these are the results for parsing a command's options, this will be |
| 435 * the name of the command. For top-level results, this returns `null`. | 391 * the name of the command. For top-level results, this returns `null`. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 459 'Could not find an option named "$name".'); | 415 'Could not find an option named "$name".'); |
| 460 } | 416 } |
| 461 | 417 |
| 462 return _options[name]; | 418 return _options[name]; |
| 463 } | 419 } |
| 464 | 420 |
| 465 /** Get the names of the options as an [Iterable]. */ | 421 /** Get the names of the options as an [Iterable]. */ |
| 466 Iterable<String> get options => _options.keys; | 422 Iterable<String> get options => _options.keys; |
| 467 } | 423 } |
| 468 | 424 |
| OLD | NEW |