Esempio n. 1
0
        private bool DoParseArgumentsVerbs(string[] args, object options, ref object verbInstance)
        {
            IList <Pair <PropertyInfo, VerbOptionAttribute> > verbs =
                ReflectionHelper.RetrievePropertyList <VerbOptionAttribute>(options);
            Pair <MethodInfo, HelpVerbOptionAttribute> helpInfo =
                ReflectionHelper.RetrieveMethod <HelpVerbOptionAttribute>(options);

            if (args.Length == 0)
            {
                if (helpInfo != null && _settings.HelpWriter != null)
                {
                    DisplayHelpVerbText(options, helpInfo, null);
                }

                return(false);
            }

            OptionMap optionMap = OptionMap.Create(options, verbs, _settings);

            if (TryParseHelpVerb(args, options, helpInfo, optionMap))
            {
                return(false);
            }

            OptionInfo verbOption = optionMap[args.First()];

            // User invoked a bad verb name
            if (verbOption is null)
            {
                if (helpInfo != null)
                {
                    DisplayHelpVerbText(options, helpInfo, null);
                }

                return(false);
            }

            verbInstance = verbOption.GetValue(options);
            if (verbInstance is null)
            {
                // Developer has not provided a default value and did not assign an instance
                verbInstance = verbOption.CreateInstance(options);
            }

            bool verbResult = DoParseArgumentsCore(args.Skip(1).ToArray(), verbInstance);

            if (!verbResult && helpInfo != null)
            {
                // Particular verb parsing failed, we try to print its help
                DisplayHelpVerbText(options, helpInfo, args.First());
            }

            return(verbResult);
        }
Esempio n. 2
0
        private bool DoParseArgumentsCore(string[] args, object options)
        {
            var hadError  = false;
            var optionMap = OptionMap.Create(options, _settings);

            optionMap.SetDefaults();
            var valueMapper = new ValueMapper(options, _settings.ParsingCulture);

            var arguments = new StringArrayEnumerator(args);

            while (arguments.MoveNext())
            {
                var argument = arguments.Current;
                if (string.IsNullOrEmpty(argument))
                {
                    continue;
                }

                var parser = ArgumentParser.Create(argument, _settings.IgnoreUnknownArguments);
                if (parser != null)
                {
                    var result = parser.Parse(arguments, optionMap, options);
                    if ((result & PresentParserState.Failure) == PresentParserState.Failure)
                    {
                        SetParserStateIfNeeded(options, parser.PostParsingState);
                        hadError = true;
                        continue;
                    }

                    if ((result & PresentParserState.MoveOnNextElement) == PresentParserState.MoveOnNextElement)
                    {
                        arguments.MoveNext();
                    }
                }
                else if (valueMapper.CanReceiveValues)
                {
                    if (!valueMapper.MapValueItem(argument))
                    {
                        hadError = true;
                    }
                }
            }

            hadError |= !optionMap.EnforceRules();

            return(!hadError);
        }