private void HandleUnexpectedArg(CommandLineApplication command, string[] args, int index, string argTypeName) { if (command._throwOnUnexpectedArg) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unrecognized {0} '{1}'", argTypeName, args[index])); } else { // All remaining arguments are stored for further use command.RemainingArguments.AddRange(new ArraySegment <string>(args, index, args.Length - index)); } }
public int Execute(params string[] args) { CommandLineApplication command = this; CommandOption option = null; IEnumerator <CommandArgument> arguments = null; for (var index = 0; index < args.Length; index++) { var arg = args[index]; var processed = false; if (!processed && option == null) { string[] longOption = null; string[] shortOption = null; if (arg.StartsWith("--")) { longOption = arg.Substring(2).Split(new[] { ':', '=' }, 2); } else if (arg.StartsWith("-")) { shortOption = arg.Substring(1).Split(new[] { ':', '=' }, 2); } if (longOption != null) { processed = true; option = command.Options.SingleOrDefault(opt => string.Equals(opt.LongName, longOption[0], StringComparison.Ordinal)); if (option == null) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unrecognized flag '{0}'", arg)); } // If we find a help/version option, show information and stop parsing if (command.OptionHelp == option) { command.ShowHelp(); return(0); } else if (command.OptionVersion == option) { command.ShowVersion(); return(0); } if (longOption.Length == 2) { if (!option.TryParse(longOption[1])) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unexpected value '{0}' for option '{1}'", longOption[1], option.LongName)); } option = null; } else if (option.OptionType == CommandOptionType.NoValue) { // No value is needed for this option option.TryParse(null); option = null; } } if (shortOption != null) { processed = true; option = command.Options.SingleOrDefault(opt => string.Equals(opt.ShortName, shortOption[0], StringComparison.Ordinal)); // If not a short option, try symbol option if (option == null) { option = command.Options.SingleOrDefault(opt => string.Equals(opt.SymbolName, shortOption[0], StringComparison.Ordinal)); } if (option == null) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unrecognized flag '{0}'", arg)); } // If we find a help/version option, show information and stop parsing if (command.OptionHelp == option) { command.ShowHelp(); return(0); } else if (command.OptionVersion == option) { command.ShowVersion(); return(0); } if (shortOption.Length == 2) { if (!option.TryParse(shortOption[1])) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unexpected value '{0}' for option '{1}'", shortOption[1], option.LongName)); } option = null; } else if (option.OptionType == CommandOptionType.NoValue) { // No value is needed for this option option.TryParse(null); option = null; } } } if (!processed && option != null) { processed = true; if (!option.TryParse(arg)) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unexpected value '{0}' for option '{1}'", arg, option.LongName)); } option = null; } if (!processed && arguments == null) { var currentCommand = command; foreach (var subcommand in command.Commands) { if (string.Equals(subcommand.Name, arg, StringComparison.OrdinalIgnoreCase)) { processed = true; command = subcommand; break; } } // If we detect a subcommand if (command != currentCommand) { processed = true; } } if (!processed) { if (arguments == null) { arguments = command.Arguments.GetEnumerator(); } if (arguments.MoveNext()) { processed = true; arguments.Current.Value = arg; } } if (!processed) { if (command._throwOnUnexpectedArg) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unexpected argument '{0}'", arg)); } else { // All remaining arguments are stored for further use command.RemainingArguments.AddRange(new ArraySegment <string>(args, index, args.Length - index)); break; } } } if (option != null) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: missing value for option")); } return(command.Invoke()); }
private void HandleUnexpectedArg(CommandLineApplication command, string[] args, int index, string argTypeName) { if (command._throwOnUnexpectedArg) { command.ShowHint(); throw new Exception(string.Format("TODO: Error: unrecognized {0} '{1}'", argTypeName, args[index])); } else { // All remaining arguments are stored for further use command.RemainingArguments.AddRange(new ArraySegment<string>(args, index, args.Length - index)); } }