Skip to content

Commit 728ea2c

Browse files
committed
- Make FluentValidation.Internal internal.
- Reduce access of some properties in Internal. - Pass Internal directly to validator lambda functions. - Add benchmark project using benchmarkdotnet.
1 parent c448301 commit 728ea2c

17 files changed

Lines changed: 101 additions & 34 deletions

CodingFlow.FluentValidation.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@
44
<Project Path="CodingFlow.FluentValidation.VogenExtensions/CodingFlow.FluentValidation.VogenExtensions.csproj" />
55
<Project Path="CodingFlow.FluentValidation/CodingFlow.FluentValidation.csproj" />
66
<Project Path="Examples/Examples.csproj" Id="31b76e57-988c-453b-b235-e2a4a4f43642" />
7+
<Project Path="PerformanceBenchmarks/PerformanceBenchmarks.csproj" Id="8f1c4ea4-e0ee-4a83-8ba8-6880ea26cba2" />
78
</Solution>

CodingFlow.FluentValidation/FluentValidation.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,11 @@
66
/// <typeparam name="T">Input type.</typeparam>
77
public class FluentValidation<T>
88
{
9-
public ValidationResult Result { get; set; }
9+
public ValidationResult Result { get; init; }
1010

1111
public List<ValidationError> Errors { get; init; } = [];
1212

13-
/// <summary>
14-
/// Used internally by the library. Do not use this property
15-
/// unless you are building your own validator.
16-
/// </summary>
17-
public Internal<T> Internal { get; private set; }
13+
internal Internal<T> Internal { get; private init; }
1814

1915
public FluentValidation(T input)
2016
{
Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,14 @@
11
namespace CodingFlow.FluentValidation;
22

3-
public class Internal<T>(FluentValidation<T> validation)
3+
internal class Internal<T>(FluentValidation<T> validation)
44
{
55
public required T Input { get; set; }
66

7-
public ValidationError LastError { get; private set; }
7+
private ValidationError LastError { get; set; }
88

9-
public void AddValid()
9+
public void Validate(Func<Internal<T>, bool> validator, ValidationError error)
1010
{
11-
LastError = default;
12-
}
13-
14-
public void AddError(ValidationError error)
15-
{
16-
validation.Result.IsValid = false;
17-
LastError = error;
18-
validation.Errors.Add(error);
19-
}
20-
21-
public void Validate(Func<FluentValidation<T>, bool> validator, ValidationError error)
22-
{
23-
if (validator(validation))
11+
if (validator(this))
2412
{
2513
AddValid();
2614
}
@@ -41,4 +29,16 @@ public void ChangeErrorMessage(string message)
4129
});
4230
}
4331
}
32+
33+
private void AddValid()
34+
{
35+
LastError = default;
36+
}
37+
38+
private void AddError(ValidationError error)
39+
{
40+
validation.Result.IsValid = false;
41+
LastError = error;
42+
validation.Errors.Add(error);
43+
}
4444
}

CodingFlow.FluentValidation/ValidationResult.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,5 @@ public record ValidationResult
1616
/// Collection of validation errors if the validation failed.
1717
/// This collection will be empty if the validation succeeded.
1818
/// </summary>
19-
public IEnumerable<ValidationError> Errors { get; set; }
19+
public required IEnumerable<ValidationError> Errors { get; set; }
2020
}

CodingFlow.FluentValidation/Validators/BetweenExclusiveValidator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ private static void Validate<T>(FluentValidation<T> validation, T minimum, T max
2525
where T : INumber<T>
2626
{
2727
validation.Internal.Validate(
28-
validation => minimum < validation.Internal.Input && validation.Internal.Input < maximum,
28+
@internal => minimum < @internal.Input && @internal.Input < maximum,
2929
new ValidationError($"Value '{validation.Internal.Input}' of type {typeof(T)} is not between {minimum} and {maximum}.")
3030
);
3131
}

CodingFlow.FluentValidation/Validators/BetweenInclusiveValidator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ private static void Validate<T>(FluentValidation<T> validation, T minimum, T max
2525
where T : INumber<T>
2626
{
2727
validation.Internal.Validate(
28-
validation => minimum <= validation.Internal.Input && validation.Internal.Input <= maximum,
28+
@internal => minimum <= @internal.Input && @internal.Input <= maximum,
2929
new ValidationError($"Value '{validation.Internal.Input}' of type {typeof(T)} is not equal to or between {minimum} and {maximum}.")
3030
);
3131
}

CodingFlow.FluentValidation/Validators/EqualValidator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static FluentValidation<T> Equal<T>(this FluentValidation<T> validation,
2121
private static void Validate<T>(FluentValidation<T> validation, T input)
2222
{
2323
validation.Internal.Validate(
24-
validation => validation.Internal.Input.Equals(input),
24+
@internal => @internal.Input.Equals(input),
2525
new ValidationError($"Value '{validation.Internal.Input}' of type {typeof(T)} is not equal to {input}.")
2626
);
2727
}

CodingFlow.FluentValidation/Validators/IsGuidValidator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public static FluentValidation<string> IsGuid(this FluentValidation<string> vali
1919
private static void Validate(FluentValidation<string> validation)
2020
{
2121
validation.Internal.Validate(
22-
validation => Guid.TryParse(validation.Internal.Input, out var value),
22+
@internal => Guid.TryParse(@internal.Input, out var value),
2323
new ValidationError($"Value '{validation.Internal.Input}' is not a valid GUID.")
2424
);
2525
}

CodingFlow.FluentValidation/Validators/MatchesValidator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static FluentValidation<string> Matches(this FluentValidation<string> val
2222
private static void Validate(FluentValidation<string> validation, string regex)
2323
{
2424
validation.Internal.Validate(
25-
validation => Regex.IsMatch(validation.Internal.Input, regex),
25+
@internal => Regex.IsMatch(@internal.Input, regex),
2626
new ValidationError($"Value '{validation.Internal.Input}' does not match the pattern.")
2727
);
2828
}

CodingFlow.FluentValidation/Validators/MaximumLengthValidator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public static FluentValidation<string> MaximumLength(this FluentValidation<strin
2020
private static void Validate(FluentValidation<string> validation, int maximum)
2121
{
2222
validation.Internal.Validate(
23-
validation => validation.Internal.Input.Length <= maximum,
23+
@internal => @internal.Input.Length <= maximum,
2424
new ValidationError($"Value '{validation.Internal.Input}' has a length more than {maximum}.")
2525
);
2626
}

0 commit comments

Comments
 (0)