public void Parse(string[] args, IEnumerable<IOption> optionsEnumerable, IEnumerable<IPositionalArgument> positionalArgumentsEnumerable, IParserResult result)
        {
            var allowOptions = true;
            var options = optionsEnumerable.ToList();
            var positionals = positionalArgumentsEnumerable.ToList();
            var argQueue = new Queue<string>();
            foreach (var arg in args)
            {
                argQueue.Enqueue(arg);
            }

            while (argQueue.Count > 0)
            {
                var arg = argQueue.Dequeue();
                ParseOutcome outcome;
                if (allowOptions && arg.StartsWith("-"))
                {
                    if (arg == "--")
                    {
                        allowOptions = false;
                        continue;
                    }
                    outcome = GetOption(result, argQueue, arg.Substring(1), options, positionals);
                }
                else
                    outcome = result.PositionalArgument(arg);

                if (outcome == ParseOutcome.Halt) return;
            }
        }
        private ParseOutcome ProcessOption(IEnumerable<IOption> options, string arg, Queue<string> argQueue, IParserResult result)
        {
            string[] optionArgs = null;
            var optionDetails = options as IList<IOption> ?? options.ToList();
            var optionNames = optionDetails.Select(o => o.Name);
            var colonPos = arg.IndexOf(':');
            if (colonPos < 0)
            {
                var colonOptionName = GetOptionName(optionNames, arg.Substring(1));
                var colonOptionDefinition = optionDetails.FirstOrDefault(o => System.String.Compare(o.Name, colonOptionName, System.StringComparison.OrdinalIgnoreCase) == 0);
                if (colonOptionDefinition != null)
                {
                    colonOptionName = colonOptionDefinition.Name;
                    optionArgs = ExtractOptionArgs(argQueue, colonOptionDefinition);
                }

                return result.OptionExtracted(colonOptionName, optionArgs ?? new string[] { });
            }

            var option = arg.Substring(1, colonPos - 1);
            var optionDefinition = optionDetails.FirstOrDefault(o => string.Compare(o.Name, option, StringComparison.OrdinalIgnoreCase) == 0);
            optionArgs = optionDefinition == null || optionDefinition.ParameterCount > 1
                ? arg.Substring(colonPos + 1).Split(',')
                : new[] {arg.Substring(colonPos + 1)};
            return result.OptionExtracted(GetOptionName(optionNames, option), optionArgs);
        }
        public void Parse(string[] args, IEnumerable<IOption> options, IEnumerable<IPositionalArgument> positionalArguments, IParserResult result)
        {
            var optionList = options as IOption[] ?? options.ToArray();
            var argQueue = new Queue<string>();
            foreach (var arg in args)
            {
                argQueue.Enqueue(arg);
            }

            while (argQueue.Count > 0)
            {
                var arg = argQueue.Dequeue();

                ParseOutcome outcome;
                if (arg.StartsWith("/"))
                    outcome = ProcessOption(optionList, arg, argQueue, result);
                else
                    outcome = result.PositionalArgument(arg);

                if (outcome == ParseOutcome.Halt)
                    return;
            }
        }
        private ParseOutcome GetOption(IParserResult result, Queue<string> argQueue, string arg, IEnumerable<IOption> options, IEnumerable<IPositionalArgument> positionals)
        {
            var embeddedOptionName = GetOptionName(arg);
            var option = options.FirstOrDefault(o => System.String.Compare(o.Name, embeddedOptionName, System.StringComparison.OrdinalIgnoreCase) == 0);
            string optionName;
            string[] optionArgs;
            if (option != null)
            {
                optionName = option.Name;
                optionArgs = ExtractOptionArgs(arg, argQueue, option);
            }
            else
            {
                var pos = positionals.FirstOrDefault(p => System.String.Compare(p.ParameterName, embeddedOptionName, System.StringComparison.OrdinalIgnoreCase) == 0);
                if (pos != null)
                    optionName = pos.ParameterName;
                else
                    optionName = embeddedOptionName;
                optionArgs = ExtractOptionArgs(arg, argQueue, null);
            }

            return result.OptionExtracted(optionName, optionArgs);
        }
        private ParseOutcome ProcessLongOption(List<IOption> longOptions, string arg, Queue<string> argQueue, IParserResult result)
        {
            string optionName;
            var equalPos = arg.IndexOf('=');
            if (equalPos < 0)
            {
                optionName = arg;

                var noEqualOption = longOptions.FirstOrDefault(o => o.Name == optionName);
                if (noEqualOption != null && noEqualOption.ParameterCount > 0 && ParameterAvailable(argQueue))
                {
                    var args = noEqualOption.ParameterCount == 1 ? new [] { argQueue.Dequeue() } : argQueue.Dequeue().Split(',');
                    return result.OptionExtracted(optionName, args);
                }

                return result.OptionExtracted(optionName, new string[] { });
            }

            optionName = arg.Substring(0, equalPos);
            var option = longOptions.FirstOrDefault(o => o.Name == optionName);
            var valuePart = arg.Substring(equalPos + 1);
            var optionArgs = option != null && option.ParameterCount == 1 ? new []{ valuePart } : valuePart.Split(',');
            return result.OptionExtracted(optionName, optionArgs);
        }
        public void Parse(string[] args, IEnumerable<IOption> options, IEnumerable<IPositionalArgument> positionalArguments, IParserResult result)
        {
            var allowOptions = true;
            var optionList = options.ToList();

            var shortOptions = optionList.Where(o => o.Name.Length == 1).ToList(); //these need "-"
            var longOptions = optionList.Where(o => o.Name.Length > 1).ToList();  // these need "--"

            var argQueue = new Queue<string>();

            foreach (var arg in args)
                argQueue.Enqueue(arg);
            while (argQueue.Count > 0)
            {
                ParseOutcome outcome;
                var arg = argQueue.Dequeue();
                if (allowOptions && arg.StartsWith("--"))
                {
                    var optionName = arg.Substring(2);
                    if (optionName == string.Empty)
                    {
                        allowOptions = false;
                        continue;
                    }

                    outcome = ProcessLongOption(longOptions, optionName, argQueue, result);
                }
                else if (allowOptions && arg.StartsWith("-"))
                    outcome = ProcessShortOption(shortOptions, arg.Substring(1), argQueue, result);
                else
                    outcome = result.PositionalArgument(arg);

                if (outcome == ParseOutcome.Halt)
                    return;
            }
        }
 public void Parse(string[] args, IEnumerable<IOption> options, IEnumerable<IPositionalArgument> positionalArguments, IParserResult result)
 {
     throw new NotImplementedException();
 }
        private ParseOutcome ProcessShortOption(List<IOption> shortOptions, string arg, Queue<string> argQueue, IParserResult result)
        {
            var option = shortOptions.FirstOrDefault(o => o.Name == GetShortOptionName(arg));
            if (option != null)
            {
                if (option.ParameterCount == 0 || option.IsBoolean)
                {
                    foreach (var optionChar in arg)
                    {
                        if (result.OptionExtracted(optionChar.ToString(CultureInfo.InvariantCulture), new string[] {}) == ParseOutcome.Halt)
                            return ParseOutcome.Halt;
                    }
                    return ParseOutcome.Continue;
                }

                if (arg.Length > 1)
                    return result.OptionExtracted(GetShortOptionName(arg), GetShortOptionArg(arg));

                if (ParameterAvailable(argQueue))
                    return result.OptionExtracted(GetShortOptionName(arg), new string[] { });

                string[] optionArgs;
                if (argQueue.Count > 0)
                    optionArgs = argQueue.Dequeue().Split(',');
                else
                    optionArgs = new string[] {};
                return result.OptionExtracted(option.Name, optionArgs);
            }

            if (arg.Length > 1)
                return result.OptionExtracted(GetShortOptionName(arg), GetShortOptionArg(arg));

            return result.OptionExtracted(arg, new string[] { });
        }
Ejemplo n.º 9
0
 public bool ChangesSubject(IParserResult subject)
 {
     return(true);
 }