Exemple #1
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;
        }