Index: mojo/public/dart/third_party/args/lib/src/option.dart |
diff --git a/mojo/public/dart/third_party/args/lib/src/option.dart b/mojo/public/dart/third_party/args/lib/src/option.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..07e87f68196b553490a7649ebd8a41c28b99274a |
--- /dev/null |
+++ b/mojo/public/dart/third_party/args/lib/src/option.dart |
@@ -0,0 +1,134 @@ |
+// 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. |
+ |
+library args.src.option; |
+ |
+import 'dart:collection'; |
+ |
+/// Creates a new [Option]. |
+/// |
+/// Since [Option] doesn't have a public constructor, this lets [ArgParser] |
+/// get to it. This function isn't exported to the public API of the package. |
+Option newOption(String name, String abbreviation, String help, |
+ String valueHelp, List<String> allowed, Map<String, String> allowedHelp, |
+ defaultValue, Function callback, OptionType type, |
+ {bool negatable, bool splitCommas, bool hide: false}) { |
+ return new Option._(name, abbreviation, help, valueHelp, allowed, allowedHelp, |
+ defaultValue, callback, type, negatable: negatable, |
+ splitCommas: splitCommas, hide: hide); |
+} |
+ |
+/// A command-line option. Includes both flags and options which take a value. |
+class Option { |
+ final String name; |
+ final String abbreviation; |
+ final List<String> allowed; |
+ final defaultValue; |
+ final Function callback; |
+ final String help; |
+ final String valueHelp; |
+ final Map<String, String> allowedHelp; |
+ final OptionType type; |
+ final bool negatable; |
+ final bool splitCommas; |
+ final bool hide; |
+ |
+ /// Whether the option is boolean-valued flag. |
+ bool get isFlag => type == OptionType.FLAG; |
+ |
+ /// Whether the option takes a single value. |
+ bool get isSingle => type == OptionType.SINGLE; |
+ |
+ /// Whether the option allows multiple values. |
+ bool get isMultiple => type == OptionType.MULTIPLE; |
+ |
+ Option._(this.name, this.abbreviation, this.help, this.valueHelp, |
+ List<String> allowed, Map<String, String> allowedHelp, this.defaultValue, |
+ this.callback, OptionType type, {this.negatable, bool splitCommas, |
+ this.hide: false}) |
+ : this.allowed = allowed == null |
+ ? null |
+ : new UnmodifiableListView(allowed), |
+ this.allowedHelp = allowedHelp == null |
+ ? null |
+ : new UnmodifiableMapView(allowedHelp), |
+ this.type = type, |
+ // If the user doesn't specify [splitCommas], it defaults to true for |
+ // multiple options. |
+ this.splitCommas = splitCommas == null |
+ ? type == OptionType.MULTIPLE |
+ : splitCommas { |
+ if (name.isEmpty) { |
+ throw new ArgumentError('Name cannot be empty.'); |
+ } else if (name.startsWith('-')) { |
+ throw new ArgumentError('Name $name cannot start with "-".'); |
+ } |
+ |
+ // Ensure name does not contain any invalid characters. |
+ if (_invalidChars.hasMatch(name)) { |
+ throw new ArgumentError('Name "$name" contains invalid characters.'); |
+ } |
+ |
+ if (abbreviation != null) { |
+ if (abbreviation.length != 1) { |
+ throw new ArgumentError('Abbreviation must be null or have length 1.'); |
+ } else if (abbreviation == '-') { |
+ throw new ArgumentError('Abbreviation cannot be "-".'); |
+ } |
+ |
+ if (_invalidChars.hasMatch(abbreviation)) { |
+ throw new ArgumentError('Abbreviation is an invalid character.'); |
+ } |
+ } |
+ } |
+ |
+ /// Returns [value] if non-`null`, otherwise returns the default value for |
+ /// this option. |
+ /// |
+ /// For single-valued options, it will be [defaultValue] if set or `null` |
+ /// otherwise. For multiple-valued options, it will be an empty list or a |
+ /// list containing [defaultValue] if set. |
+ dynamic getOrDefault(value) { |
+ if (value != null) return value; |
+ |
+ if (!isMultiple) return defaultValue; |
+ if (defaultValue != null) return [defaultValue]; |
+ return []; |
+ } |
+ |
+ static final _invalidChars = new RegExp(r'''[ \t\r\n"'\\/]'''); |
+} |
+ |
+/// What kinds of values an option accepts. |
+class OptionType { |
+ /// An option that can only be `true` or `false`. |
+ /// |
+ /// The presence of the option name itself in the argument list means `true`. |
+ static const FLAG = const OptionType._("OptionType.FLAG"); |
+ |
+ /// An option that takes a single value. |
+ /// |
+ /// Examples: |
+ /// |
+ /// --mode debug |
+ /// -mdebug |
+ /// --mode=debug |
+ /// |
+ /// If the option is passed more than once, the last one wins. |
+ static const SINGLE = const OptionType._("OptionType.SINGLE"); |
+ |
+ /// An option that allows multiple values. |
+ /// |
+ /// Example: |
+ /// |
+ /// --output text --output xml |
+ /// |
+ /// In the parsed [ArgResults], a multiple-valued option will always return |
+ /// a list, even if one or no values were passed. |
+ static const MULTIPLE = const OptionType._("OptionType.MULTIPLE"); |
+ |
+ final String name; |
+ |
+ const OptionType._(this.name); |
+} |