Exemple #1
0
        private OptionAndValue SplitOptionAndValueString(string optionAndValueStr)
        {
            OptionAndValue optionAndValue = new OptionAndValue();
            int            separatorIdx   = optionAndValueStr.IndexOf(":");

            optionAndValue.Option = optionAndValueStr.Substring(0, separatorIdx);
            optionAndValue.Value  = optionAndValueStr.Substring(separatorIdx + 1, optionAndValueStr.Length - (separatorIdx + 1));
            return(optionAndValue);
        }
Exemple #2
0
        private void ProcessValueOption(string parameter)
        {
            string         optionAndValueStr = this.StripOptionCharacter(parameter);
            OptionAndValue optionAndValue    = this.SplitOptionAndValueString(optionAndValueStr);

            if (this.Strict)
            {
                this.AssertOptionNameIsKnown(optionAndValue.Option);
            }
            if (!this.IsOptionNameKnown(optionAndValue.Option))
            {
                this.ApplyNonStrictOptionConfiguration(optionAndValue.Option, optionAndValue.Value);
            }
            else
            {
                this.ApplyOptionConfiguration(
                    OptionsConfigurationHash[optionAndValue.Option],
                    optionAndValue.Option,
                    optionAndValue.Value
                    );
            }
        }
        public bool TryProcessArguments(IVerb verb, IEnumerable <IOption> options, IEnumerable <string> arguments, out IEnumerable <OptionAndValue> optionValues, out IEnumerable <IError> errors)
        {
            if (verb == null)
            {
                throw new ArgumentNullException(nameof(verb));
            }
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }
            if (arguments == null)
            {
                throw new ArgumentNullException(nameof(arguments));
            }

            var positionalOptions      = options.OfType <PositionalOptionAttribute>().ToArray();
            var flagOptions            = options.OfType <FlagOptionAttribute>().ToArray();
            var namedCollectionOptions = options.OfType <NamedCollectionOptionAttribute>().ToArray();
            var namedOptions           = options.OfType <NamedOptionAttribute>().ToArray();

            int positionalArgumentCount = 0;
            var argsArray = arguments.ToArray();
            List <OptionAndValue> providedOptions = new List <OptionAndValue>();

            for (int i = 0; i < argsArray.Length; i++)
            {
                var argument      = argsArray[i];
                var parameterName = _parameterFormatter.Parse(argument);

                if (HandleNamedOption(argsArray, ref i, parameterName, providedOptions, namedOptions))
                {
                    continue;
                }
                else if (HandleFlagOption(parameterName, providedOptions, flagOptions))
                {
                    continue;
                }
                else if (HandlePositionOption(argument, providedOptions, positionalOptions, ref positionalArgumentCount))
                {
                    continue;
                }
                else if (HandleNamedCollectionOption(argsArray, ref i, parameterName, providedOptions, namedCollectionOptions, flagOptions, namedOptions))
                {
                    continue;
                }
                {
                    optionValues = new OptionAndValue[0];
                    errors       = new IError[] { new OptionForArgumentNotFoundError(verb, argument, positionalArgumentCount) };
                    return(false);
                }
            }

            //check required parameters.
            foreach (var requiredOption in options.Where((o) => o.Required))
            {
                var providedOption = providedOptions.FirstOrDefault((o) => o.Option == requiredOption);
                if (providedOption == null)
                {
                    optionValues = new OptionAndValue[0];
                    errors       = new IError[] { new RequiredParameterMissingError(verb, requiredOption.Name) };
                    return(false);
                }
                else if (providedOption.Option is NamedCollectionOptionAttribute collectionOption && providedOption.ValueAsList().Count < collectionOption.MinimumCount)
                {
                    optionValues = new OptionAndValue[0];
                    errors       = new IError[] { new NotEnoughElementsError(verb, collectionOption.Name, collectionOption.MinimumCount) };
                    return(false);
                }
            }

            optionValues = providedOptions;
            errors       = new IError[0];
            return(true);
        }