Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 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();
 }