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; }
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; }