using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace AsbCloudApp.Data;
///
/// Плановое значение и максимально допустимое ограничение
///
public class PlanLimitDto
{
///
/// План
///
[Required]
public double Plan { get; set; }
///
/// Максимальное ограничение
///
[Required]
public double LimitMax { get; set; }
///
/// Валидация
///
/// Общий диапазон для плана и ограничения
///
///
public virtual IEnumerable Validate((double GE, double LE) commonRange, string paramName)
=> Validate(commonRange, commonRange, paramName);
///
/// Валидация
///
///
///
/// Название параметра для которого задается план и ограничение
///
public virtual IEnumerable Validate((double GE, double LE) planRange, (double GE, double LE) limitMaxRange, string paramName)
{
if (Plan < planRange.GE || Plan > planRange.LE)
yield return new ValidationResult($"{paramName} плановое значение должно быть в диапазоне [{planRange.GE}; {planRange.LE}].");
if (Plan < planRange.GE || Plan > planRange.LE)
yield return new ValidationResult($"{paramName} ограничивающее значение должно быть в диапазоне [{limitMaxRange.GE}; {limitMaxRange.LE}].");
}
}
///
/// Реализация RangeAttribute для PlanLimitDto
///
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter,
AllowMultiple = false)]
public class RangePlanLimitAttribute : ValidationAttribute
{
private readonly double minimum;
private readonly double maximum;
///
/// Реализация RangeAttribute для PlanLimitDto
///
///
///
public RangePlanLimitAttribute(double minimum, double maximum)
{
this.minimum = minimum;
this.maximum = maximum;
}
///
public override bool IsValid(object? value)
{
try
{
if(value is PlanLimitDto dto)
{
var isPlanValid = dto.Plan <= maximum && dto.Plan >= minimum;
var isLimitMaxValid = dto.LimitMax <= maximum && dto.LimitMax >= minimum;
return isPlanValid && isLimitMaxValid;
}
}catch{}
return false;
}
}