using System.Reflection;
namespace ArgumentsToolkit;
///
/// Класс для выполнения валидации модели Options на основе атрибутов.
///
public static class Validator
{
///
/// Проверяет объект на соответствие правилам валидации.
///
/// Тип модели опций.
/// Экземпляр модели опций.
/// Список ошибок валидации.
/// true, если ошибок нет; иначе false.
public static bool Validate(T options, out string[] errors)
{
var list = new List();
var props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var p in props)
{
// Проверяем только свойства с [Option]
var optionAttr = p.GetCustomAttribute();
if (optionAttr == null) continue;
var val = p.GetValue(options);
// Берём все атрибуты, которые реализуют IValidationAttribute
foreach (var attr in p.GetCustomAttributes().OfType())
{
if (!attr.Validate(val))
{
var error = attr.GetErrorMessage(optionAttr.Name, val);
list.Add(error);
}
}
}
errors = list.ToArray();
return list.Count == 0;
}
}