diff --git a/src/libcmdline/Parsing/OptionGroupParser.cs b/src/libcmdline/Parsing/OptionGroupParser.cs index 9199b914..e8d173f4 100644 --- a/src/libcmdline/Parsing/OptionGroupParser.cs +++ b/src/libcmdline/Parsing/OptionGroupParser.cs @@ -47,72 +47,83 @@ public override PresentParserState Parse(IArgumentEnumerator argumentEnumerator, option.IsDefined = true; - ArgumentParser.EnsureOptionArrayAttributeIsNotBoundToScalar(option); - - if (!option.IsBoolean) + ArgumentParser.EnsureOptionArrayAttributeIsNotBoundToScalar(option); + + //previous place + + if (!option.IsBoolean && argumentEnumerator.IsLast && optionGroup.IsLast) { - if (argumentEnumerator.IsLast && optionGroup.IsLast) - { - return PresentParserState.Failure; - } - - bool valueSetting; - if (!optionGroup.IsLast) - { - if (!option.IsArray) - { - valueSetting = option.SetValue(optionGroup.GetRemainingFromNext(), options); - if (!valueSetting) - { - DefineOptionThatViolatesFormat(option); - } - - return ArgumentParser.BooleanToParserState(valueSetting); - } - - ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); - - var items = ArgumentParser.GetNextInputValues(argumentEnumerator); - items.Insert(0, optionGroup.GetRemainingFromNext()); - - valueSetting = option.SetValue(items, options); - if (!valueSetting) - { - DefineOptionThatViolatesFormat(option); - } - - return ArgumentParser.BooleanToParserState(valueSetting, true); - } - - if (!argumentEnumerator.IsLast && !ArgumentParser.IsInputValue(argumentEnumerator.Next)) - { - return PresentParserState.Failure; - } + return PresentParserState.Failure; + } + bool valueSetting; + if (!optionGroup.IsLast) + { if (!option.IsArray) { - valueSetting = option.SetValue(argumentEnumerator.Next, options); - if (!valueSetting) + valueSetting = option.SetValue(optionGroup.GetRemainingFromNext(), options); + if (!valueSetting && !option.IsBoolean) { DefineOptionThatViolatesFormat(option); } - return ArgumentParser.BooleanToParserState(valueSetting, true); + if (valueSetting || !option.IsBoolean) + return ArgumentParser.BooleanToParserState(valueSetting); + } + + if (!option.IsBoolean) + { + ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); + + var items = ArgumentParser.GetNextInputValues(argumentEnumerator); + items.Insert(0, optionGroup.GetRemainingFromNext()); + + valueSetting = option.SetValue(items, options); + if (!valueSetting) + { + DefineOptionThatViolatesFormat(option); + } + + return ArgumentParser.BooleanToParserState(valueSetting, true); } + } - ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); - - var moreItems = ArgumentParser.GetNextInputValues(argumentEnumerator); + if (!option.IsBoolean && !argumentEnumerator.IsLast && !ArgumentParser.IsInputValue(argumentEnumerator.Next)) + { + return PresentParserState.Failure; + } - valueSetting = option.SetValue(moreItems, options); - if (!valueSetting) - { - DefineOptionThatViolatesFormat(option); + if (!option.IsArray) + { + valueSetting = option.SetValue(argumentEnumerator.Next, options); + if (!option.IsBoolean || valueSetting) + { + if (!valueSetting) + { + DefineOptionThatViolatesFormat(option); + } + + return ArgumentParser.BooleanToParserState(valueSetting, true); } - - return ArgumentParser.BooleanToParserState(valueSetting); + } + + if (!option.IsBoolean) + { + ArgumentParser.EnsureOptionAttributeIsArrayCompatible(option); + + var moreItems = ArgumentParser.GetNextInputValues(argumentEnumerator); + + valueSetting = option.SetValue(moreItems, options); + if (!valueSetting) + { + DefineOptionThatViolatesFormat(option); + } + + return ArgumentParser.BooleanToParserState(valueSetting); } + //old place close + if (!optionGroup.IsLast && map[optionGroup.Next] == null) { return PresentParserState.Failure; diff --git a/src/tests/Unit/Parser/ParserFixture.cs b/src/tests/Unit/Parser/ParserFixture.cs index fcf15f2d..2d5984cd 100644 --- a/src/tests/Unit/Parser/ParserFixture.cs +++ b/src/tests/Unit/Parser/ParserFixture.cs @@ -531,7 +531,23 @@ public void Parser_should_report_missing_value() options.LastParserState.Errors.Count.Should().BeGreaterThan(0); } - #endregion + #endregion + + [Fact] + public void Parse_falsible_boolean() + { + var options = new BooleanSetOptions(); + var parser = new CommandLine.Parser(); + var result = parser.ParseArguments(new string[] { "-a true", "-c false", "-d65" }, options); + + result.Should().BeTrue(); + options.BooleanOne.Should().BeTrue(); + options.BooleanTwo.Should().BeFalse(); + options.BooleanThree.Should().BeFalse(); + options.NonBooleanValue.Should().Be(65D); + Console.WriteLine(options); + } + } }