// Path: src/main/java/com/michaelfotiadis/validator/annotated/model/ValidationResult.java
// public class ValidationResult {
// 
//     private final ValidationStatus status;
// 
//     public ValidationResult(final ValidationStatus status) {
//         this.status = status;
//     }
// 
//     public ValidationResult(final boolean isValid) {
//         if (isValid) {
//             this.status = ValidationStatus.SUCCESS;
//         } else {
//             this.status = ValidationStatus.UNDEFINED_FAILURE;
//         }
//     }
// 
//     /**
//      * Static factory
//      *
//      * @return successful {@link ValidationResult}
//      */
//     public static ValidationResult success() {
//         return new ValidationResult(ValidationStatus.SUCCESS);
//     }
// 
//     /**
//      * Static factory
//      *
//      * @return failed {@link ValidationResult}
//      */
//     public static ValidationResult failure() {
//         return new ValidationResult(ValidationStatus.UNDEFINED_FAILURE);
//     }
// 
//     /**
//      * Static factory
//      *
//      * @return null max {@link ValidationResult}
//      */
//     public static ValidationResult nullValue() {
//         return new ValidationResult(ValidationStatus.NULL_VALUE);
//     }
// 
//     public ValidationStatus getStatus() {
//         return this.status;
//     }
// 
//     public boolean isValid() {
//         return this.status == ValidationStatus.SUCCESS;
//     }
// 
// }
// 
// Path: src/main/java/com/michaelfotiadis/validator/annotated/model/ValidationStatus.java
// public enum ValidationStatus {
// 
//     UNDEFINED_FAILURE,
//     NULL_VALUE,
//     EMPTY_COLLECTION,
//     COLLECTION_CONTAINS_NULL,
//     PATTERN_DID_NOT_MATCH,
//     EMPTY_STRING,
//     INVALID_VALUE,
//     WRONG_TYPE_ARGUMENTS,
//     VALUE_OUT_OF_RANGE,
//     NUMBER_OUT_OF_RANGE,
//     INTEGER_OUT_OF_RANGE,
//     BYTE_OUT_OF_RANGE,
//     DOUBLE_OUT_OF_RANGE,
//     FLOAT_OUT_OF_RANGE,
//     EXCEPTION,
//     SUCCESS
// 
// }
// 
// Path: src/main/java/com/michaelfotiadis/validator/annotated/validators/Validator.java
// public interface Validator<T> {
// 
//     ValidationResult validate(T item, Annotation annotation);
// 
// }


import com.michaelfotiadis.validator.annotated.annotations.numeric.doublenum.DoubleEqualsValue;
import com.michaelfotiadis.validator.annotated.annotations.numeric.doublenum.DoubleMaxValue;
import com.michaelfotiadis.validator.annotated.annotations.numeric.doublenum.DoubleMinValue;
import com.michaelfotiadis.validator.annotated.model.ValidationResult;
import com.michaelfotiadis.validator.annotated.model.ValidationStatus;
import com.michaelfotiadis.validator.annotated.validators.Validator;
import java.lang.annotation.Annotation;
package com.michaelfotiadis.validator.annotated.validators.numeric;



/**
 *
 */
public class DoubleValidator implements Validator<Double> {

    @Override
    public ValidationResult validate(final Double value, final Annotation annotation) {

        final Class<? extends Annotation> type = annotation.annotationType();

        if (type.equals(DoubleMaxValue.class)) {
            final DoubleMaxValue clazz = ((DoubleMaxValue) annotation);
            return handleMaxValue(value, clazz.max(), clazz.epsilon());
// Path: src/main/java/com/michaelfotiadis/validator/annotated/model/ValidationResult.java
// public class ValidationResult {
// 
//     private final ValidationStatus status;
// 
//     public ValidationResult(final ValidationStatus status) {
//         this.status = status;
//     }
// 
//     public ValidationResult(final boolean isValid) {
//         if (isValid) {
//             this.status = ValidationStatus.SUCCESS;
//         } else {
//             this.status = ValidationStatus.UNDEFINED_FAILURE;
//         }
//     }
// 
//     /**
//      * Static factory
//      *
//      * @return successful {@link ValidationResult}
//      */
//     public static ValidationResult success() {
//         return new ValidationResult(ValidationStatus.SUCCESS);
//     }
// 
//     /**
//      * Static factory
//      *
//      * @return failed {@link ValidationResult}
//      */
//     public static ValidationResult failure() {
//         return new ValidationResult(ValidationStatus.UNDEFINED_FAILURE);
//     }
// 
//     /**
//      * Static factory
//      *
//      * @return null max {@link ValidationResult}
//      */
//     public static ValidationResult nullValue() {
//         return new ValidationResult(ValidationStatus.NULL_VALUE);
//     }
// 
//     public ValidationStatus getStatus() {
//         return this.status;
//     }
// 
//     public boolean isValid() {
//         return this.status == ValidationStatus.SUCCESS;
//     }
// 
// }
// 
// Path: src/main/java/com/michaelfotiadis/validator/annotated/model/ValidationStatus.java
// public enum ValidationStatus {
// 
//     UNDEFINED_FAILURE,
//     NULL_VALUE,
//     EMPTY_COLLECTION,
//     COLLECTION_CONTAINS_NULL,
//     PATTERN_DID_NOT_MATCH,
//     EMPTY_STRING,
//     INVALID_VALUE,
//     WRONG_TYPE_ARGUMENTS,
//     VALUE_OUT_OF_RANGE,
//     NUMBER_OUT_OF_RANGE,
//     INTEGER_OUT_OF_RANGE,
//     BYTE_OUT_OF_RANGE,
//     DOUBLE_OUT_OF_RANGE,
//     FLOAT_OUT_OF_RANGE,
//     EXCEPTION,
//     SUCCESS
// 
// }
// 
// Path: src/main/java/com/michaelfotiadis/validator/annotated/validators/Validator.java
// public interface Validator<T> {
// 
//     ValidationResult validate(T item, Annotation annotation);
// 
// }


// Path: src/main/java/com/michaelfotiadis/validator/annotated/validators/numeric/DoubleValidator.java
import com.michaelfotiadis.validator.annotated.annotations.numeric.doublenum.DoubleEqualsValue;
import com.michaelfotiadis.validator.annotated.annotations.numeric.doublenum.DoubleMaxValue;
import com.michaelfotiadis.validator.annotated.annotations.numeric.doublenum.DoubleMinValue;
import com.michaelfotiadis.validator.annotated.model.ValidationResult;
import com.michaelfotiadis.validator.annotated.model.ValidationStatus;
import com.michaelfotiadis.validator.annotated.validators.Validator;
import java.lang.annotation.Annotation;

package com.michaelfotiadis.validator.annotated.validators.numeric;



/**
 *
 */
public class DoubleValidator implements Validator<Double> {

    @Override
    public ValidationResult validate(final Double value, final Annotation annotation) {

        final Class<? extends Annotation> type = annotation.annotationType();

        if (type.equals(DoubleMaxValue.class)) {
            final DoubleMaxValue clazz = ((DoubleMaxValue) annotation);
            return handleMaxValue(value, clazz.max(), clazz.epsilon());
        } else if (type.equals(DoubleMinValue.class)) {