package com.ruoyi.common.valid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.reflect.Method;

/**
 * 2023/10/20
 * 枚举值校验
 */
public class EnumValidator implements ConstraintValidator<EnumValid, Object> {

	private EnumValid annotation;

	@Override
	public void initialize(EnumValid constraintAnnotation) {
		this.annotation = constraintAnnotation;
	}

	/**
	 * 判断是否校验成功
	 * @param value 待校验的值
	 * @return 校验结果
	 */
	@Override
	public boolean isValid(Object value, ConstraintValidatorContext context) {
		// 如果待校验的值为null，是否校验通过
		if (value == null) {
			return annotation.allowNull();
		}
		// 返回枚举常量的数组
		Object[] objects = annotation.clazz().getEnumConstants();
		try {
			// 获取枚举类中获取校验字段的方法名
			Method method = annotation.clazz().getMethod(annotation.method());
			for (Object o : objects) {
				// 将方法执行的结果method.invoke(o)和待校验的值value进行比较，如果相同，说明校验成功
				if (value.equals(method.invoke(o))) {
					return true;
				}
			}
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		// 如果value没有在枚举值中，校验失败
		return false;
	}
}

