Skip to content

Commit

Permalink
Change signature of ApplyCondition to take a PropertyValidatorContext…
Browse files Browse the repository at this point in the history
… in the callback.

This aids with extensibility.
  • Loading branch information
JeremySkinner committed Jul 14, 2018
1 parent 455aacc commit acd78dc
Show file tree
Hide file tree
Showing 7 changed files with 21 additions and 21 deletions.
4 changes: 2 additions & 2 deletions src/FluentValidation/AbstractValidator.cs
Expand Up @@ -235,7 +235,7 @@ public abstract class AbstractValidator<T> : IValidator<T>, IEnumerable<IValidat
}

// Must apply the predicate after the rule has been fully created to ensure any rules-specific conditions have already been applied.
propertyRules.ForEach(x => x.ApplyCondition(ctx => predicate((T)ctx.InstanceToValidate)));
propertyRules.ForEach(x => x.ApplyCondition(ctx => predicate((T)ctx.Instance)));
}

/// <summary>
Expand Down Expand Up @@ -263,7 +263,7 @@ public abstract class AbstractValidator<T> : IValidator<T>, IEnumerable<IValidat
}

// Must apply the predicate after the rule has been fully created to ensure any rules-specific conditions have already been applied.
propertyRules.ForEach(x => x.ApplyAsyncCondition((ctx, token) => predicate((T)ctx.InstanceToValidate, token)));
propertyRules.ForEach(x => x.ApplyAsyncCondition((ctx, token) => predicate((T)ctx.Instance, token)));
}

/// <summary>
Expand Down
4 changes: 2 additions & 2 deletions src/FluentValidation/DefaultValidatorOptions.cs
Expand Up @@ -154,7 +154,7 @@ public static class DefaultValidatorOptions {
predicate.Guard("A predicate must be specified when calling When.", nameof(predicate));
// Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain.
return rule.Configure(config => {
config.ApplyCondition(ctx => predicate((T)ctx.InstanceToValidate), applyConditionTo);
config.ApplyCondition(ctx => predicate((T)ctx.Instance), applyConditionTo);
});
}

Expand Down Expand Up @@ -183,7 +183,7 @@ public static class DefaultValidatorOptions {
predicate.Guard("A predicate must be specified when calling WhenAsync.", nameof(predicate));
// Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain.
return rule.Configure(config => {
config.ApplyAsyncCondition((ctx, ct) => predicate((T)ctx.InstanceToValidate, ct), applyConditionTo);
config.ApplyAsyncCondition((ctx, ct) => predicate((T)ctx.Instance, ct), applyConditionTo);
});
}

Expand Down
4 changes: 2 additions & 2 deletions src/FluentValidation/FluentValidation.csproj
Expand Up @@ -12,13 +12,13 @@ FluentValidation 8 is a major release. Please read the upgrade notes at https://

Changes in 8.0:
* Added OnFailure method
* Removed RuleFor(..).SetCollectionValidator in favour of RuleForEach(...).SetValidator
* Deprecated RuleFor(..).SetCollectionValidator in favour of RuleForEach(...).SetValidator
* IStringSource.GetString now takes a validation context instead of a model instance.
* Introduce PropertyValidatorOptions in order to clean up the IPropretyValidator interface.
* Moved the legacy ValidatorAttribute and AttributedValidatorFactory into a separate FluentValidation.Attributes package.
* Remove the pre-7.0 localization mechanism
* Remove the pre-7.0 methods for custom validation
* Removed many other deprecated methods
* Remove many deprecated methods

Full release notes can be found at https://github.com/JeremySkinner/FluentValidation/blob/master/Changelog.txt
</PackageReleaseNotes>
Expand Down
4 changes: 2 additions & 2 deletions src/FluentValidation/IValidationRule.cs
Expand Up @@ -58,13 +58,13 @@ public interface IValidationRule {
/// </summary>
/// <param name="predicate"></param>
/// <param name="applyConditionTo"></param>
void ApplyCondition(Func<ValidationContext, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators);
void ApplyCondition(Func<PropertyValidatorContext, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators);

/// <summary>
/// Applies a condition to the rule asynchronously
/// </summary>
/// <param name="predicate"></param>
/// <param name="applyConditionTo"></param>
void ApplyAsyncCondition(Func<ValidationContext, CancellationToken, Task<bool>> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators);
void ApplyAsyncCondition(Func<PropertyValidatorContext, CancellationToken, Task<bool>> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators);
}
}
4 changes: 2 additions & 2 deletions src/FluentValidation/Internal/CollectionPropertyRule.cs
Expand Up @@ -78,7 +78,7 @@ public class CollectionPropertyRule<TProperty> : PropertyRule {
var propertyContext = new PropertyValidatorContext(context, this, propertyName);
var delegatingValidator = validator as IDelegatingValidator;

if (delegatingValidator == null || delegatingValidator.CheckCondition(propertyContext.ParentContext)) {
if (delegatingValidator == null || delegatingValidator.CheckCondition(propertyContext)) {
var collectionPropertyValue = propertyContext.PropertyValue as IEnumerable<TProperty>;

if (collectionPropertyValue != null) {
Expand Down Expand Up @@ -139,7 +139,7 @@ public class CollectionPropertyRule<TProperty> : PropertyRule {
var propertyContext = new PropertyValidatorContext(context, this, propertyName);
var results = new List<ValidationFailure>();
var delegatingValidator = validator as IDelegatingValidator;
if (delegatingValidator == null || delegatingValidator.CheckCondition(propertyContext.ParentContext)) {
if (delegatingValidator == null || delegatingValidator.CheckCondition(propertyContext)) {
var collectionPropertyValue = propertyContext.PropertyValue as IEnumerable<TProperty>;

int count = 0;
Expand Down
4 changes: 2 additions & 2 deletions src/FluentValidation/Internal/PropertyRule.cs
Expand Up @@ -419,7 +419,7 @@ public class PropertyRule : IValidationRule {
/// </summary>
/// <param name="predicate"></param>
/// <param name="applyConditionTo"></param>
public void ApplyCondition(Func<ValidationContext, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) {
public void ApplyCondition(Func<PropertyValidatorContext, bool> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) {
// Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain.
if (applyConditionTo == ApplyConditionTo.AllValidators) {
foreach (var validator in Validators.ToList()) {
Expand All @@ -444,7 +444,7 @@ public class PropertyRule : IValidationRule {
/// </summary>
/// <param name="predicate"></param>
/// <param name="applyConditionTo"></param>
public void ApplyAsyncCondition(Func<ValidationContext, CancellationToken, Task<bool>> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) {
public void ApplyAsyncCondition(Func<PropertyValidatorContext, CancellationToken, Task<bool>> predicate, ApplyConditionTo applyConditionTo = ApplyConditionTo.AllValidators) {
// Default behaviour for When/Unless as of v1.3 is to apply the condition to all previous validators in the chain.
if (applyConditionTo == ApplyConditionTo.AllValidators) {
foreach (var validator in Validators.ToList()) {
Expand Down
18 changes: 9 additions & 9 deletions src/FluentValidation/Validators/DelegatingValidator.cs
Expand Up @@ -29,42 +29,42 @@ namespace FluentValidation.Validators {
using Results;

public class DelegatingValidator : IPropertyValidator, IDelegatingValidator {
private readonly Func<ValidationContext, bool> _condition;
private readonly Func<ValidationContext, CancellationToken, Task<bool>> _asyncCondition;
private readonly Func<PropertyValidatorContext, bool> _condition;
private readonly Func<PropertyValidatorContext, CancellationToken, Task<bool>> _asyncCondition;
public IPropertyValidator InnerValidator { get; private set; }

public bool ShouldValidateAsync(ValidationContext context) {
return InnerValidator.ShouldValidateAsync(context) || _asyncCondition != null;
}

public DelegatingValidator(Func<ValidationContext, bool> condition, IPropertyValidator innerValidator) {
public DelegatingValidator(Func<PropertyValidatorContext, bool> condition, IPropertyValidator innerValidator) {
_condition = condition;
_asyncCondition = null;
InnerValidator = innerValidator;
}

public DelegatingValidator(Func<ValidationContext, CancellationToken, Task<bool>> asyncCondition, IPropertyValidator innerValidator) {
public DelegatingValidator(Func<PropertyValidatorContext, CancellationToken, Task<bool>> asyncCondition, IPropertyValidator innerValidator) {
_condition = _ => true;
_asyncCondition = asyncCondition;
InnerValidator = innerValidator;
}

public IEnumerable<ValidationFailure> Validate(PropertyValidatorContext context) {
if (_condition(context.ParentContext)) {
if (_condition(context)) {
return InnerValidator.Validate(context);
}

return Enumerable.Empty<ValidationFailure>();
}

public async Task<IEnumerable<ValidationFailure>> ValidateAsync(PropertyValidatorContext context, CancellationToken cancellation) {
if (!_condition(context.ParentContext))
if (!_condition(context))
return Enumerable.Empty<ValidationFailure>();

if (_asyncCondition == null)
return await InnerValidator.ValidateAsync(context, cancellation);

bool shouldValidate = await _asyncCondition(context.ParentContext, cancellation);
bool shouldValidate = await _asyncCondition(context, cancellation);

if (shouldValidate) {
return await InnerValidator.ValidateAsync(context, cancellation);
Expand All @@ -77,7 +77,7 @@ public class DelegatingValidator : IPropertyValidator, IDelegatingValidator {

IPropertyValidator IDelegatingValidator.InnerValidator => InnerValidator;

public bool CheckCondition(ValidationContext context) {
public bool CheckCondition(PropertyValidatorContext context) {
return _condition(context);
}

Expand All @@ -86,6 +86,6 @@ public class DelegatingValidator : IPropertyValidator, IDelegatingValidator {

public interface IDelegatingValidator : IPropertyValidator {
IPropertyValidator InnerValidator { get; }
bool CheckCondition(ValidationContext context);
bool CheckCondition(PropertyValidatorContext context);
}
}

0 comments on commit acd78dc

Please sign in to comment.