Example #1
0
        private void ValidateCommand(CommandResult commandResult)
        {
            foreach (var a in commandResult
                     .Command
                     .Arguments)
            {
                if (a is Argument argument)
                {
                    var arityFailure = ArgumentArity.Validate(
                        commandResult,
                        a,
                        a.Arity.MinimumNumberOfValues,
                        a.Arity.MaximumNumberOfValues);

                    if (arityFailure != null)
                    {
                        _errors.Add(
                            new ParseError(arityFailure.ErrorMessage, commandResult));
                    }

                    foreach (var validator in argument.SymbolValidators)
                    {
                        var errorMessage = validator(commandResult);

                        if (!string.IsNullOrWhiteSpace(errorMessage))
                        {
                            _errors.Add(
                                new ParseError(errorMessage, commandResult));
                        }
                    }
                }
            }
        }
Example #2
0
        private void ValidateArgument(ArgumentResult argumentResult)
        {
            var arityFailure = ArgumentArity.Validate(argumentResult);

            if (arityFailure != null)
            {
                _errors.Add(new ParseError(arityFailure.ErrorMessage));
                return;
            }

            if (argumentResult.Argument is Argument argument)
            {
                var parseError = argumentResult.Parent.UnrecognizedArgumentError(argument) ??
                                 argumentResult.Parent.CustomError(argument);

                if (parseError != null)
                {
                    _errors.Add(parseError);
                    return;
                }
            }

            if (argumentResult.ArgumentConversionResult is FailedArgumentConversionResult failed)
            {
                _errors.Add(
                    new ParseError(
                        failed.ErrorMessage,
                        argumentResult));
            }
        }
Example #3
0
        protected override void Stop(SyntaxNode node)
        {
            ValidateCommandHandler(_innermostCommandResult);

            foreach (var commandResult in _innermostCommandResult.RecurseWhileNotNull(c => c.ParentCommandResult))
            {
                foreach (var symbol in commandResult.Command.Children)
                {
                    PopulateDefaultValues(commandResult, symbol);
                }

                ValidateCommand(commandResult);

                foreach (var result in commandResult.Children)
                {
                    switch (result)
                    {
                    case ArgumentResult argumentResult:

                        ValidateArgument(argumentResult);

                        break;

                    case OptionResult optionResult:

                        var argument = optionResult.Option.Argument;

                        var arityFailure = ArgumentArity.Validate(
                            optionResult,
                            argument,
                            argument.Arity.MinimumNumberOfValues,
                            argument.Arity.MaximumNumberOfValues);

                        if (arityFailure != null)
                        {
                            _errors.Add(
                                new ParseError(arityFailure.ErrorMessage, optionResult));
                        }

                        var results = optionResult.Children
                                      .OfType <ArgumentResult>()
                                      .ToArray();

                        foreach (var a in results)
                        {
                            ValidateArgument(a);
                        }

                        break;
                    }
                }
            }
        }
Example #4
0
        private void ValidateCommandResult()
        {
            if (_innermostCommandResult !.Command is Command command)
            {
                for (var i = 0; i < command.Validators.Count; i++)
                {
                    var validator    = command.Validators[i];
                    var errorMessage = validator(_innermostCommandResult);

                    if (!string.IsNullOrWhiteSpace(errorMessage))
                    {
                        _errors.Add(
                            new ParseError(errorMessage !, _innermostCommandResult));
                    }
                }
            }

            foreach (var option in _innermostCommandResult
                     .Command
                     .Options)
            {
                if (option is Option o &&
                    o.IsRequired &&
                    _rootCommandResult !.FindResultFor(o) is null)
                {
                    _errors.Add(
                        new ParseError($"Option '{o.Aliases.First()}' is required.",
                                       _innermostCommandResult));
                }
            }

            foreach (var symbol in _innermostCommandResult
                     .Command
                     .Arguments)
            {
                var arityFailure = ArgumentArity.Validate(
                    _innermostCommandResult,
                    symbol,
                    symbol.Arity.MinimumNumberOfValues,
                    symbol.Arity.MaximumNumberOfValues);

                if (arityFailure != null)
                {
                    _errors.Add(
                        new ParseError(arityFailure.ErrorMessage !, _innermostCommandResult));
                }
            }
        }
Example #5
0
        private void ValidateCommandResult(CommandResult commandResult)
        {
            if (commandResult.Command is Command command)
            {
                foreach (var validator in command.Validators)
                {
                    var errorMessage = validator(commandResult);

                    if (!string.IsNullOrWhiteSpace(errorMessage))
                    {
                        _errors.Add(
                            new ParseError(errorMessage, commandResult));
                    }
                }
            }

            foreach (var option in commandResult
                     .Command
                     .Options)
            {
                if (option is Option o &&
                    o.Required &&
                    _rootCommandResult.FindResultFor(o) == null)
                {
                    _errors.Add(
                        new ParseError($"Option '{o.RawAliases.First()}' is required.",
                                       commandResult));
                }
            }

            foreach (var symbol in commandResult
                     .Command
                     .Arguments)
            {
                var arityFailure = ArgumentArity.Validate(
                    commandResult,
                    symbol,
                    symbol.Arity.MinimumNumberOfValues,
                    symbol.Arity.MaximumNumberOfValues);

                if (arityFailure != null)
                {
                    _errors.Add(
                        new ParseError(arityFailure.ErrorMessage, commandResult));
                }
            }
        }
Example #6
0
        private void ValidateOptionResult(OptionResult optionResult)
        {
            var argument = optionResult.Option.Argument;

            var arityFailure = ArgumentArity.Validate(
                optionResult,
                argument,
                argument.Arity.MinimumNumberOfValues,
                argument.Arity.MaximumNumberOfValues);

            if (arityFailure != null)
            {
                _errors.Add(
                    new ParseError(arityFailure.ErrorMessage !, optionResult));
            }

            if (optionResult.Option is Option option)
            {
                for (var i = 0; i < option.Validators.Count; i++)
                {
                    var validate = option.Validators[i];
                    var message  = validate(optionResult);

                    if (!string.IsNullOrWhiteSpace(message))
                    {
                        _errors.Add(new ParseError(message !, optionResult));
                    }
                }
            }

            for (var i = 0; i < optionResult.Children.Count; i++)
            {
                var result = optionResult.Children[i];
                if (result is ArgumentResult argumentResult)
                {
                    ValidateArgumentResult(argumentResult);
                }
            }
        }
        private void ValidateOptionResult(OptionResult optionResult)
        {
            var argument = optionResult.Option.Argument;

            var arityFailure = ArgumentArity.Validate(
                optionResult,
                argument,
                argument.Arity.MinimumNumberOfValues,
                argument.Arity.MaximumNumberOfValues);

            if (arityFailure != null)
            {
                _errors.Add(
                    new ParseError(arityFailure.ErrorMessage !, optionResult));
            }

            if (optionResult.Option is Option option)
            {
                foreach (var validate in option.Validators)
                {
                    var message = validate(optionResult);

                    if (!string.IsNullOrWhiteSpace(message))
                    {
                        _errors.Add(new ParseError(message !, optionResult));
                    }
                }
            }

            foreach (var argumentResult in optionResult
                     .Children
                     .OfType <ArgumentResult>())
            {
                ValidateArgumentResult(argumentResult);
            }
        }
Example #8
0
        internal virtual ArgumentConversionResult Convert(
            IArgument argument)
        {
            var parentResult = Parent;

            if (ShouldCheckArity() &&
                ArgumentArity.Validate(parentResult,
                                       argument,
                                       argument.Arity.MinimumNumberOfValues,
                                       argument.Arity.MaximumNumberOfValues) is FailedArgumentConversionResult failedResult)
            {
                return(failedResult);
            }

            if (parentResult.UseDefaultValueFor(argument))
            {
                var defaultValueFor = parentResult.GetDefaultValueFor(argument);

                return(ArgumentConversionResult.Success(argument, defaultValueFor));
            }

            if (argument is Argument a &&
                a.ConvertArguments != null)
            {
                if (ConversionResult != null)
                {
                    return(ConversionResult);
                }

                var success = a.ConvertArguments(this, out var value);

                if (value is ArgumentConversionResult conversionResult)
                {
                    return(conversionResult);
                }
                else if (success)
                {
                    return(ArgumentConversionResult.Success(argument, value));
                }
                else
                {
                    return(ArgumentConversionResult.Failure(argument, ErrorMessage ?? $"Invalid: {parentResult.Token()} {string.Join(" ", parentResult.Tokens.Select(t => t.Value))}"));
                }
            }

            switch (argument.Arity.MaximumNumberOfValues)
            {
            case 0:
                return(ArgumentConversionResult.Success(argument, null));

            case 1:
                return(ArgumentConversionResult.Success(argument, parentResult.Tokens.Select(t => t.Value).SingleOrDefault()));

            default:
                return(ArgumentConversionResult.Success(argument, parentResult.Tokens.Select(t => t.Value).ToArray()));
            }

            bool ShouldCheckArity()
            {
                return(!(parentResult is OptionResult optionResult &&
                         optionResult.IsImplicit));
            }
        }