public ValidationResult Validate()

in plugin-dotnet-agent/src/main/csharp/TeamCity.Dotnet.TestSuppressor/TeamCity.Dotnet.TestSuppressor/Infrastructure/CommandLine/Validation/CommandValidator.cs [16:58]


    public ValidationResult Validate(Command command) =>
        _commandLineParsingResult.UnknownParameters.Count != 0
            ? ValidationResult.Invalid($"Unknown arguments: {string.Join(", ", _commandLineParsingResult.UnknownParameters)}")
            : ValidateProperties(command);

    private static ValidationResult ValidateProperties(Command command)
    {
        var validationErrors = new List<string>();

        // check command properties
        foreach (var property in command.GetType().GetProperties())
        {
            var value = property.GetValue(command);
            
            if (value is Command { IsActive: true } nestedCommand)
            {
                var nestedValidationResult = ValidateProperties(nestedCommand);
                if (!nestedValidationResult.IsValid)
                {
                    var commandAttribute = property.GetCustomAttribute<CommandAttribute>()!;
                    validationErrors.Add($"Errors in command `{commandAttribute.Command}`:");
                    validationErrors.Add(nestedValidationResult.ErrorMessage);
                    continue;
                }
            }
            
            var validationAttributes = property.GetCustomAttributes<ValidationAttribute>();

            // check other validation attributes
            foreach (var attribute in validationAttributes)
            {
                var validationResult = attribute.Validate(value!);
                if (!validationResult.IsValid)
                {
                    validationErrors.Add(FormatValidationError(validationResult.ErrorMessage));
                }
            }
        }

        return validationErrors.Count != 0
            ? ValidationResult.Invalid(string.Join(Environment.NewLine, validationErrors))
            : ValidationResult.Valid;
    }