|
@@ -2,7 +2,7 @@
|
|
|
|
|
|
namespace PixiEditor.ChangeableDocument.Changeables.Graph;
|
|
namespace PixiEditor.ChangeableDocument.Changeables.Graph;
|
|
|
|
|
|
-public delegate (bool validationResult, object? closestValidValue) ValidateProperty(object? value);
|
|
|
|
|
|
+public delegate ValidatorResult ValidateProperty(object? value);
|
|
|
|
|
|
public class PropertyValidator
|
|
public class PropertyValidator
|
|
{
|
|
{
|
|
@@ -25,15 +25,21 @@ public class PropertyValidator
|
|
if (value is T val)
|
|
if (value is T val)
|
|
{
|
|
{
|
|
bool isValid = val.CompareTo(min) >= 0;
|
|
bool isValid = val.CompareTo(min) >= 0;
|
|
- return (isValid, isValid ? val : GetReturnValue(val, min, adjust));
|
|
|
|
|
|
+ return new (isValid, isValid ? val : GetReturnValue(val, min, adjust));
|
|
}
|
|
}
|
|
|
|
|
|
- return (false, GetReturnValue(min, min, adjust));
|
|
|
|
|
|
+ return new (false, GetReturnValue(min, min, adjust));
|
|
});
|
|
});
|
|
|
|
|
|
return this;
|
|
return this;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public PropertyValidator Custom(ValidateProperty rule)
|
|
|
|
+ {
|
|
|
|
+ Rules.Add(rule);
|
|
|
|
+ return this;
|
|
|
|
+ }
|
|
|
|
+
|
|
private object? GetReturnValue<T>(T original, T min, Func<T, T>? fallback) where T : IComparable<T>
|
|
private object? GetReturnValue<T>(T original, T min, Func<T, T>? fallback) where T : IComparable<T>
|
|
{
|
|
{
|
|
if (fallback != null)
|
|
if (fallback != null)
|
|
@@ -44,25 +50,46 @@ public class PropertyValidator
|
|
return min;
|
|
return min;
|
|
}
|
|
}
|
|
|
|
|
|
- public bool Validate(object? value)
|
|
|
|
|
|
+ public bool Validate(object? value, out string? errors)
|
|
{
|
|
{
|
|
object lastValue = value;
|
|
object lastValue = value;
|
|
|
|
|
|
foreach (var rule in Rules)
|
|
foreach (var rule in Rules)
|
|
{
|
|
{
|
|
- var (isValid, toPass) = rule(lastValue);
|
|
|
|
- lastValue = toPass;
|
|
|
|
- if (!isValid)
|
|
|
|
|
|
+ var result = rule(lastValue);
|
|
|
|
+ lastValue = result.ClosestValidValue;
|
|
|
|
+ if (!result.IsValid)
|
|
{
|
|
{
|
|
|
|
+ errors = result.ErrorMessage;
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ errors = null;
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
|
|
|
|
public object? GetClosestValidValue(object? o)
|
|
public object? GetClosestValidValue(object? o)
|
|
{
|
|
{
|
|
- return Rules.Aggregate(o, (current, rule) => rule(current).closestValidValue);
|
|
|
|
|
|
+ return Rules.Aggregate(o, (current, rule) => rule(current).ClosestValidValue);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+public record ValidatorResult
|
|
|
|
+{
|
|
|
|
+ public bool IsValid { get; }
|
|
|
|
+ public object? ClosestValidValue { get; }
|
|
|
|
+ public string? ErrorMessage { get; }
|
|
|
|
+
|
|
|
|
+ public ValidatorResult(bool isValid, string? errorMessage)
|
|
|
|
+ {
|
|
|
|
+ IsValid = isValid;
|
|
|
|
+ ErrorMessage = errorMessage;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public ValidatorResult(bool isValid, object? closestValidValue)
|
|
|
|
+ {
|
|
|
|
+ IsValid = isValid;
|
|
|
|
+ ClosestValidValue = closestValidValue;
|
|
}
|
|
}
|
|
}
|
|
}
|