private static AbstractApplicationParameter ProcessParameterModel(ApplicationParameterModel p, ApplicationParametersModel paramsModel, IList <String> args, IList <String> argsListReadOnly, IList <ValidationError> errors, ref Int32 idx) { var arg = args[idx]; if (p.Expandable) { var eArgs = TryExpandArgumentsRecursively(paramsModel.ParameterParser, arg); if (eArgs != null) { // Expanded successfully args.RemoveAt(idx); for (var i = eArgs.Count - 1; i >= 0; --i) { args.Insert(idx, eArgs[i]); } // Read-only list should reflect the changed list } } AbstractApplicationParameter pInstance = null; if (idx < args.Count) { arg = args[idx]; foreach (var optionModel in p.PossibleOptions) { String on, ov, errorMsg; Object ovt; var oldIdx = idx; idx += paramsModel.ParameterParser.TryParseOption(argsListReadOnly, idx, optionModel, out on, out ov, out ovt, out errorMsg); if (idx > oldIdx) { pInstance = new ApplicationOptionParameter(p, optionModel, on, ov, ovt); if (errorMsg != null) { errors.Add(new ValidationError(on, errorMsg)); } break; } } if (pInstance == null && p.CanBeNonOption) { pInstance = new ApplicationValueParameter(p, arg); idx += 1; } } return(pInstance); }
public SimpleApplicationParameters(SimpleApplicationParametersModel model, String[] args) : base(model, args, pList => { var options = pList.Where(p => Object.ReferenceEquals(p.ParameterModel, model.OptionModel)).ToArray(); var optionNames = options.Select(p => ((ApplicationOptionParameter)p).OptionName); var optionNameSet = new HashSet <String>(optionNames, StringComparer.OrdinalIgnoreCase); ValidationError[] errors = null; if (options.Length != optionNameSet.Count) { // Duplicates occurred var optionNameList = new List <String>(optionNames); // Find the option names that were duplicated foreach (var on in optionNameSet) { optionNameList.Remove(on); } // Remove the ones which are allowed to have duplicates foreach (var d in model.OptionsWithDuplicatesAllowed) { optionNameList.RemoveAll(str => String.Equals(str, d, StringComparison.OrdinalIgnoreCase)); } // If there are any actual duplicates left, create error if (optionNameList.Count > 0) { errors = new[] { new ValidationError(null, "Duplicate option names: " + String.Join(", ", optionNameList)) }; } } return(errors); }) { var optionParams = this.Parameters .Where(p => Object.ReferenceEquals(p.ParameterModel, model.OptionModel)) .Cast <ApplicationOptionParameter>(); this._options = optionParams .GroupBy(p => p.OptionName) .ToDictionary(g => g.Key, g => (IList <ApplicationOptionParameter>) new ReadOnlyCollection <ApplicationOptionParameter>(g.ToList())); this._values = new ReadOnlyCollection <String>(this.Parameters .Where(p => Object.ReferenceEquals(p.ParameterModel, model.ValueModel)) .Cast <ApplicationValueParameter>() .Select(p => p.Value) .ToList()); this._separatorParameter = this.Parameters .Where(p => Object.ReferenceEquals(p.ParameterModel, model.OptionAndValueSeparator)) .Cast <ApplicationOptionParameter>() .FirstOrDefault(); this._helpOptionPresent = optionParams .Where(p => Object.ReferenceEquals(p.Model, model.HelpOption)) .Any(); }