internal static ArgumentDictionary ParseCommand(string[] cmd, CommandSwitch[] switches) { ArgumentDictionary arguments; //switches/values from cmd line string arg; //argument to test next CommandSwitch argSwitch; //switch corresponding to that argument string argValue; //value corresponding to that argument int delim; //location of value delimiter (':' or '=') arguments = new ArgumentDictionary(cmd.Length); foreach (string s in cmd) { arg = s; bool argIsFlag = true; //if argument does not start with switch indicator, place into "default" arguments if ((arg[0] != '/') && (arg[0] != '-')) { arguments.Add(String.Empty, arg); continue; } //if we have something which begins with '/' or '-', throw if nothing after it if (arg.Length == 1) { throw new ArgumentException(SR.GetString(SR.ErrSwitchMissing, arg)); } //yank switch indicator ('/' or '-') off of command argument arg = arg.Substring(1); //check to make sure delimiter does not start off switch delim = arg.IndexOfAny(new char[] { ':', '=' }); if (delim == 0) { throw new ArgumentException(SR.GetString(SR.ErrUnexpectedDelimiter)); } //if there is no value, than create a null string if (delim == (-1)) { argValue = String.Empty; } else { //assume valid argument now; must remove value attached to it //must avoid copying delimeter into either arguments argValue = arg.Substring(delim + 1); arg = arg.Substring(0, delim); argIsFlag = false; } //check if this switch exists in the list of possible switches //if no match found, then throw an exception argSwitch = CommandSwitch.FindSwitch(arg.ToLower(CultureInfo.InvariantCulture), switches); if (argSwitch == null) { throw new ArgumentException(SR.GetString(SR.ErrUnknownSwitch, arg.ToLower(CultureInfo.InvariantCulture))); } //check if switch is allowed to have a value // if not and a value has been specified, then thrown an exception if (argSwitch.SwitchType == SwitchType.Flag) { if (!argIsFlag) { throw new ArgumentException(SR.GetString(SR.ErrUnexpectedValue, arg.ToLower(CultureInfo.InvariantCulture))); } } else { if (argIsFlag) { throw new ArgumentException(SR.GetString(SR.ErrExpectedValue, arg.ToLower(CultureInfo.InvariantCulture))); } } //check if switch is allowed to be specified multiple times // if not and it has already been specified and a new value has been paresd, throw an exception if (argSwitch.SwitchType != SwitchType.ValueList && arguments.ContainsArgument(argSwitch.Name)) { throw new ArgumentException(SR.GetString(SR.ErrSingleUseSwitch, arg.ToLower(CultureInfo.InvariantCulture))); } else { arguments.Add(argSwitch.Name, argValue); } } return(arguments); }
private Options(ArgumentDictionary arguments) { OptionProcessingHelper optionProcessor = new OptionProcessingHelper(this, arguments); optionProcessor.ProcessArguments(); }
internal OptionProcessingHelper(Options options, ArgumentDictionary arguments) { _parent = options; _arguments = arguments; }
internal static ArgumentDictionary ParseCommand(string[] cmd, CommandSwitch[] switches) { ArgumentDictionary arguments; //switches/values from cmd line string arg; //argument to test next CommandSwitch argSwitch; //switch corresponding to that argument string argValue; //value corresponding to that argument int delim; //location of value delimiter (':' or '=') arguments = new ArgumentDictionary(cmd.Length); foreach (string s in cmd) { arg = s; bool argIsFlag = true; //if argument does not start with switch indicator, place into "default" arguments if ((arg[0] != '/') && (arg[0] != '-')) { arguments.Add(String.Empty, arg); continue; } //if we have something which begins with '/' or '-', throw if nothing after it if (arg.Length == 1) throw new ArgumentException(SR.GetString(SR.ErrSwitchMissing, arg)); //yank switch indicator ('/' or '-') off of command argument arg = arg.Substring(1); //check to make sure delimiter does not start off switch delim = arg.IndexOfAny(new char[] { ':', '=' }); if (delim == 0) throw new ArgumentException(SR.GetString(SR.ErrUnexpectedDelimiter)); //if there is no value, than create a null string if (delim == (-1)) argValue = String.Empty; else { //assume valid argument now; must remove value attached to it //must avoid copying delimeter into either arguments argValue = arg.Substring(delim + 1); arg = arg.Substring(0, delim); argIsFlag = false; } //check if this switch exists in the list of possible switches //if no match found, then throw an exception argSwitch = CommandSwitch.FindSwitch(arg.ToLower(CultureInfo.InvariantCulture), switches); if (argSwitch == null) throw new ArgumentException(SR.GetString(SR.ErrUnknownSwitch, arg.ToLower(CultureInfo.InvariantCulture))); //check if switch is allowed to have a value // if not and a value has been specified, then thrown an exception if (argSwitch.SwitchType == SwitchType.Flag) { if (!argIsFlag) throw new ArgumentException(SR.GetString(SR.ErrUnexpectedValue, arg.ToLower(CultureInfo.InvariantCulture))); } else { if (argIsFlag) throw new ArgumentException(SR.GetString(SR.ErrExpectedValue, arg.ToLower(CultureInfo.InvariantCulture))); } //check if switch is allowed to be specified multiple times // if not and it has already been specified and a new value has been paresd, throw an exception if (argSwitch.SwitchType != SwitchType.ValueList && arguments.ContainsArgument(argSwitch.Name)) { throw new ArgumentException(SR.GetString(SR.ErrSingleUseSwitch, arg.ToLower(CultureInfo.InvariantCulture))); } else { arguments.Add(argSwitch.Name, argValue); } } return arguments; }