Index: lib/src/parser.dart |
diff --git a/lib/src/parser.dart b/lib/src/parser.dart |
index 1e297b0e68b35069f57527e85ac3f6d8a63e781f..848bb9c293601cf77f2763d2b0a6b122e7e08598 100644 |
--- a/lib/src/parser.dart |
+++ b/lib/src/parser.dart |
@@ -131,7 +131,7 @@ class Parser { |
args.removeAt(0); |
if (option.isFlag) { |
- setOption(results, option, true); |
+ setFlag(results, option, true); |
} else { |
readNextArgAsValue(option); |
} |
@@ -196,7 +196,7 @@ class Parser { |
validate( |
option.isFlag, 'Option "-$c" must be a flag to be in a collapsed "-".'); |
- setOption(results, option, true); |
+ setFlag(results, option, true); |
} |
/// Tries to parse the current argument as a long-form named option, which |
@@ -213,7 +213,7 @@ class Parser { |
validate(longOpt[3] == null, |
'Flag option "$name" should not be given a value.'); |
- setOption(results, option, true); |
+ setFlag(results, option, true); |
} else if (longOpt[3] != null) { |
// We have a value like --foo=bar. |
setOption(results, option, longOpt[3]); |
@@ -235,7 +235,7 @@ class Parser { |
validate(option.isFlag, 'Cannot negate non-flag option "$name".'); |
validate(option.negatable, 'Cannot negate option "$name".'); |
- setOption(results, option, false); |
+ setFlag(results, option, false); |
} else { |
// Walk up to the parent command if possible. |
validate(parent != null, 'Could not find an option named "$name".'); |
@@ -252,19 +252,42 @@ class Parser { |
if (!condition) throw new FormatException(message); |
} |
- /// Validates and stores [value] as the value for [option]. |
- void setOption(Map results, Option option, value) { |
- // See if it's one of the allowed values. |
- if (option.allowed != null) { |
- validate(option.allowed.any((allow) => allow == value), |
- '"$value" is not an allowed value for option "${option.name}".'); |
+ /// Validates and stores [value] as the value for [option], which must not be |
+ /// a flag. |
+ void setOption(Map results, Option option, String value) { |
+ assert(!option.isFlag); |
+ |
+ if (!option.isMultiple) { |
+ _validateAllowed(option, value); |
+ results[option.name] = value; |
+ return; |
} |
- if (option.isMultiple) { |
- var list = results.putIfAbsent(option.name, () => []); |
- list.add(value); |
+ var list = results.putIfAbsent(option.name, () => []); |
+ |
+ if (option.splitCommas) { |
+ for (var element in value.split(",")) { |
+ _validateAllowed(option, element); |
+ list.add(element); |
+ } |
} else { |
- results[option.name] = value; |
+ _validateAllowed(option, value); |
+ list.add(value); |
} |
} |
+ |
+ /// Validates and stores [value] as the value for [option], which must be a |
+ /// flag. |
+ void setFlag(Map results, Option option, bool value) { |
+ assert(option.isFlag); |
+ results[option.name] = value; |
+ } |
+ |
+ /// Validates that [value] is allowed as a value of [option]. |
+ void _validateAllowed(Option option, String value) { |
+ if (option.allowed == null) return; |
+ |
+ validate(option.allowed.contains(value), |
+ '"$value" is not an allowed value for option "${option.name}".'); |
+ } |
} |