예제 #1
0
        public ArgumentTokenStream(IEnumerable <string> args, ArgumentParseOptions parseOptions)
        {
            bool colonIsUsedForArgumentSeparator = (parseOptions & ArgumentParseOptions.ColonSeparatesArgValues) ==
                                                   ArgumentParseOptions.ColonSeparatesArgValues;

            _trimQuotes = (parseOptions & ArgumentParseOptions.TrimQuotes) == ArgumentParseOptions.TrimQuotes;
            IEnumerable <string> tokens = args.Select(a => a ?? "");

            if (!colonIsUsedForArgumentSeparator)
            {
                _args = tokens.ToList();
            }
            else
            {
                _args = new List <string>();
                foreach (string arg in tokens)
                {
                    int colonIndex = arg.IndexOf(':');
                    if (colonIndex > 0)
                    {
                        _args.Add(arg.Substring(0, colonIndex));
                        if (colonIndex + 1 < arg.Length)
                        {
                            _args.Add(arg.Substring(colonIndex + 1));
                        }
                    }
                    else
                    {
                        _args.Add(arg);
                    }
                }
            }

            _cursor = -1;
        }
예제 #2
0
        public void Parse(string[] rawArguments, ArgumentParseOptions parseOptions = ArgumentParseOptions.None)
        {
            foreach (var arg in _args)
            {
                arg.ClearValues();
            }
            IsValid = false;
            Errors  = new List <string>();
            IArgument[] args   = _args.ToArray();
            var         tokens = new ArgumentTokenStream(rawArguments, parseOptions);

            while (tokens.Advance())
            {
                string    argumentNameToken = tokens.CurrentToken;
                string    argumentName      = argumentNameToken.TrimStart('-', '/');
                IArgument matchingArgument  = args.FirstOrDefault(arg =>
                                                                  arg.ShortName == argumentName || arg.LongName == argumentName);

                if (matchingArgument == null)
                {
                    Errors.Add(string.Format("unknown argument '{0}'", argumentName));
                }
                else if (matchingArgument is SwitchArgument)
                {
                    matchingArgument.AddValue(true);
                    matchingArgument.IsMissing = false;
                }
                else if (tokens.Advance())
                {
                    object actualValue;
                    if (TryGetActualValue(tokens.CurrentToken, matchingArgument, out actualValue))
                    {
                        matchingArgument.AddValue(actualValue);
                        matchingArgument.IsMissing = false;
                    }
                    else
                    {
                        Errors.Add(string.Format("invalid argument value for {0}: {1}", argumentNameToken,
                                                 tokens.CurrentToken));
                    }
                }
                else
                {
                    Errors.Add("The argument '" + argumentNameToken + "' was specified but no value was provided");
                }
            }

            for (int i = 0; i < args.Length; i++)
            {
                IArgument arg = args[i];
                if (arg.IsRequired && arg.IsMissing)
                {
                    Errors.Add(string.Format("missing argument '{0}'", arg.LongName));
                }
            }

            IsValid = Errors.Count == 0;
        }