Пример #1
0
        public override PresentParserState Parse(IArgumentEnumerator argumentEnumerator, OptionMap map, object options)
        {
            var optionGroup = new OneCharStringEnumerator(argumentEnumerator.Current.Substring(1));

            while (optionGroup.MoveNext())
            {
                OptionInfo option = map[optionGroup.Current];
                if (option is null)
                {
                    return(_ignoreUnkwnownArguments ? PresentParserState.MoveOnNextElement : PresentParserState.Failure);
                }

                option.IsDefined = true;

                EnsureOptionArrayAttributeIsNotBoundToScalar(option);

                if (!option.IsBoolean)
                {
                    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(BooleanToParserState(valueSetting));
                        }

                        EnsureOptionAttributeIsArrayCompatible(option);

                        IList <string> items = GetNextInputValues(argumentEnumerator);
                        items.Insert(0, optionGroup.GetRemainingFromNext());

                        valueSetting = option.SetValue(items, options);
                        if (!valueSetting)
                        {
                            DefineOptionThatViolatesFormat(option);
                        }

                        return(BooleanToParserState(valueSetting, true));
                    }

                    if (!argumentEnumerator.IsLast && !IsInputValue(argumentEnumerator.Next))
                    {
                        return(PresentParserState.Failure);
                    }

                    if (!option.IsArray)
                    {
                        valueSetting = option.SetValue(argumentEnumerator.Next, options);
                        if (!valueSetting)
                        {
                            DefineOptionThatViolatesFormat(option);
                        }

                        return(BooleanToParserState(valueSetting, true));
                    }

                    EnsureOptionAttributeIsArrayCompatible(option);

                    IList <string> moreItems = GetNextInputValues(argumentEnumerator);

                    valueSetting = option.SetValue(moreItems, options);
                    if (!valueSetting)
                    {
                        DefineOptionThatViolatesFormat(option);
                    }

                    return(BooleanToParserState(valueSetting));
                }

                if (!optionGroup.IsLast && map[optionGroup.Next] is null)
                {
                    return(PresentParserState.Failure);
                }

                if (!option.SetValue(true, options))
                {
                    return(PresentParserState.Failure);
                }
            }

            return(PresentParserState.Success);
        }
Пример #2
0
        public override PresentParserState Parse(IArgumentEnumerator argumentEnumerator, OptionMap map, object options)
        {
            string[]   parts  = argumentEnumerator.Current.Substring(2).Split(new[] { '=' }, 2);
            OptionInfo option = map[parts[0]];

            if (option is null)
            {
                return(_ignoreUnkwnownArguments ? PresentParserState.MoveOnNextElement : PresentParserState.Failure);
            }

            option.IsDefined = true;

            EnsureOptionArrayAttributeIsNotBoundToScalar(option);

            bool valueSetting;

            if (!option.IsBoolean)
            {
                if (parts.Length == 1 && (argumentEnumerator.IsLast || !IsInputValue(argumentEnumerator.Next)))
                {
                    return(PresentParserState.Failure);
                }

                if (parts.Length == 2)
                {
                    if (!option.IsArray)
                    {
                        valueSetting = option.SetValue(parts[1], options);
                        if (!valueSetting)
                        {
                            DefineOptionThatViolatesFormat(option);
                        }

                        return(BooleanToParserState(valueSetting));
                    }

                    EnsureOptionAttributeIsArrayCompatible(option);

                    IList <string> items = GetNextInputValues(argumentEnumerator);
                    items.Insert(0, parts[1]);

                    valueSetting = option.SetValue(items, options);
                    if (!valueSetting)
                    {
                        DefineOptionThatViolatesFormat(option);
                    }

                    return(BooleanToParserState(valueSetting));
                }
                else
                {
                    if (!option.IsArray)
                    {
                        valueSetting = option.SetValue(argumentEnumerator.Next, options);
                        if (!valueSetting)
                        {
                            DefineOptionThatViolatesFormat(option);
                        }

                        return(BooleanToParserState(valueSetting, true));
                    }

                    EnsureOptionAttributeIsArrayCompatible(option);

                    IList <string> items = GetNextInputValues(argumentEnumerator);

                    valueSetting = option.SetValue(items, options);
                    if (!valueSetting)
                    {
                        DefineOptionThatViolatesFormat(option);
                    }

                    return(BooleanToParserState(valueSetting));
                }
            }

            if (parts.Length == 2)
            {
                return(PresentParserState.Failure);
            }

            valueSetting = option.SetValue(true, options);
            if (!valueSetting)
            {
                DefineOptionThatViolatesFormat(option);
            }

            return(BooleanToParserState(valueSetting));
        }