Exemplo n.º 1
0
        internal ParseResult Parse(
            IReadOnlyCollection <string> rawArgs,
            bool isProgressive)
        {
            var validTokens = DefinedOptions
                              .FlattenBreadthFirst()
                              .SelectMany(o => o.Aliases)
                              .Distinct()
                              .ToArray();

            var unparsedTokens  = new Queue <string>(Normalize(rawArgs).Lex(validTokens));
            var appliedOptions  = new OptionSet <AppliedOption>();
            var errors          = new List <OptionError>();
            var unmatchedTokens = new List <string>();

            AppliedOption currentOption = null;

            string arg;

            while (unparsedTokens.Any())
            {
                arg = unparsedTokens.Dequeue();

                if (arg == "--")
                {
                    // stop parsing further args
                    break;
                }

                if (DefinedOptions.Any(o => o.HasAlias(arg)))
                {
                    var option = appliedOptions.SingleOrDefault(o => o.HasAlias(arg));

                    var alreadySeen = option != null;

                    if (!alreadySeen)
                    {
                        option = new AppliedOption(
                            DefinedOptions.Single(s => s.HasAlias(arg)),
                            arg);

                        appliedOptions.Add(option);
                    }

                    if (!option.Option.IsCommand || !alreadySeen)
                    {
                        currentOption = option;
                        continue;
                    }
                }

                unmatchedTokens.Add(arg);

                if (currentOption != null)
                {
                    unmatchedTokens = currentOption
                                      .TryTakeTokens(unmatchedTokens.ToArray())
                                      .ToList();
                }
            }

            errors.AddRange(
                unmatchedTokens.Select(UnrecognizedArg));

            return(new ParseResult(
                       this,
                       rawArgs,
                       appliedOptions,
                       isProgressive,
                       unparsedTokens,
                       unmatchedTokens,
                       errors));
        }