Improve validations

This commit is contained in:
TheXamlGuy
2024-06-22 14:06:54 +01:00
parent 34d3cc313b
commit 5e170ea526
+25 -14
View File
@@ -6,10 +6,9 @@ namespace Toolkit.Foundation;
public class Validation(IValidatorCollection validators) : public class Validation(IValidatorCollection validators) :
IValidation IValidation
{ {
public event PropertyChangedEventHandler? PropertyChanged;
private readonly ValidationErrorCollection errors = []; private readonly ValidationErrorCollection errors = [];
public event PropertyChangedEventHandler? PropertyChanged;
public IReadOnlyDictionary<string, string> Errors => public IReadOnlyDictionary<string, string> Errors =>
errors.AsReadOnly(); errors.AsReadOnly();
@@ -44,6 +43,8 @@ public class Validation(IValidatorCollection validators) :
string? name = GetPropertyName(property); string? name = GetPropertyName(property);
Validator validator = new(name, rules); Validator validator = new(name, rules);
Clear(name);
(bool isValid, string? message) = await validator.TryValidate(); (bool isValid, string? message) = await validator.TryValidate();
if (!isValid) if (!isValid)
@@ -57,13 +58,9 @@ public class Validation(IValidatorCollection validators) :
return !HasErrors; return !HasErrors;
} }
public async Task<bool> Validate(string name) public async Task<bool> Validate(string name)
{ {
if (Errors.ContainsKey(name)) Clear(name);
{
errors.Remove(name);
}
if (Validators.TryGet(name, out Validator? validator)) if (Validators.TryGet(name, out Validator? validator))
{ {
@@ -85,7 +82,7 @@ public class Validation(IValidatorCollection validators) :
public async Task<bool> Validate() public async Task<bool> Validate()
{ {
errors.Clear(); Clear();
foreach (Validator? validator in Validators) foreach (Validator? validator in Validators)
{ {
if (validator.PropertyName is string name) if (validator.PropertyName is string name)
@@ -104,12 +101,26 @@ public class Validation(IValidatorCollection validators) :
return !HasErrors; return !HasErrors;
} }
private string GetPropertyName<T>(Expression<Func<T>> predicate) private void Clear(string name)
{ {
Expression? body = predicate.Body; if (Errors.ContainsKey(name))
MemberExpression? memberExpression = body as MemberExpression ?? {
(MemberExpression)((UnaryExpression)body).Operand; errors.Remove(name);
OnPropertyChanged(nameof(Errors), null, null);
return memberExpression.Member.Name; }
}
private void Clear()
{
errors.Clear();
OnPropertyChanged(nameof(Errors), null, null);
}
private string GetPropertyName<T>(Expression<Func<T>> expression)
{
return expression.Body switch
{
MemberExpression memberExpression => memberExpression.Member.Name,
UnaryExpression unaryExpression when unaryExpression.Operand is MemberExpression operand => operand.Member.Name,
_ => string.Empty
};
} }
} }