// Path: yfiton-api/src/main/java/com/yfiton/api/exceptions/ConversionException.java
// public class ConversionException extends ParameterException {
// 
//     private final String resolution;
// 
//     public ConversionException(String parameterName, String parameterValue, Class<?> expectedValueType) {
//         this("Invalid value for parameter '" + parameterName + "'",
//                 expectedValueType.getSimpleName() + " value expected but received '" + parameterValue + "'");
//     }
// 
//     private ConversionException(String message, String resolution) {
//         super(message);
//         this.resolution = resolution;
//     }
// 
//     /**
//      * Returns a message that explains how to fix the conversion error that has been encountered.
//      *
//      * @return a message that explains how to fix the conversion error that has been encountered.
//      */
//     public String getResolution() {
//         return resolution;
//     }
// 
// }
// 
// Path: yfiton-api/src/main/java/com/yfiton/api/exceptions/ParameterException.java
// public class ParameterException extends YfitonException {
// 
//     public ParameterException() {
//     }
// 
//     public ParameterException(String message) {
//         super(message);
//     }
// 
//     public ParameterException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public ParameterException(Throwable cause) {
//         super(cause);
//     }
// 
//     public ParameterException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// 
// }
// 
// Path: yfiton-api/src/main/java/com/yfiton/api/parameter/converters/Converter.java
// public interface Converter<T> {
// 
//     T convert(String parameterName, String parameterValue) throws ConversionException;
// 
// }
// 
// Path: yfiton-api/src/main/java/com/yfiton/api/parameter/validators/Validator.java
// public interface Validator<T> {
// 
//     /**
//      * Check whether the specified parameter {@code value} is valid. If not, a
//      * checked exception that contains the cause is thrown.
//      *
//      * @param parameterName  the name of the parameter to check.
//      * @param parameterValue the associated value to check.
//      * @throws ValidationException if the parameter value is invalid.
//      */
//     void validate(String parameterName, T parameterValue) throws ValidationException;
// 
// }


import com.yfiton.api.exceptions.ConversionException;
import com.yfiton.api.exceptions.ParameterException;
import com.yfiton.api.parameter.converters.Converter;
import com.yfiton.api.parameter.validators.Validator;
        if (required != parameter.required) return false;
        if (!name.equals(parameter.name)) return false;
        if (!description.equals(parameter.description)) return false;
        if (!type.equals(parameter.type)) return false;
        if (!defaultValue.equals(parameter.defaultValue)) return false;
        if (!converter.equals(parameter.converter)) return false;
        return validator.equals(parameter.validator);

    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + description.hashCode();
        result = 31 * result + (hidden ? 1 : 0);
        result = 31 * result + (required ? 1 : 0);
        result = 31 * result + type.hashCode();
        result = 31 * result + defaultValue.hashCode();
        result = 31 * result + converter.hashCode();
        result = 31 * result + validator.hashCode();
        return result;
    }

    @Override
    public String toString() {
        return "Parameter{" +
                "name='" + name + '\'' +
                ", description='" + description + '\'' +
                ", hidden=" + hidden +
                ", required=" + required +
// Path: yfiton-api/src/main/java/com/yfiton/api/exceptions/ConversionException.java
// public class ConversionException extends ParameterException {
// 
//     private final String resolution;
// 
//     public ConversionException(String parameterName, String parameterValue, Class<?> expectedValueType) {
//         this("Invalid value for parameter '" + parameterName + "'",
//                 expectedValueType.getSimpleName() + " value expected but received '" + parameterValue + "'");
//     }
// 
//     private ConversionException(String message, String resolution) {
//         super(message);
//         this.resolution = resolution;
//     }
// 
//     /**
//      * Returns a message that explains how to fix the conversion error that has been encountered.
//      *
//      * @return a message that explains how to fix the conversion error that has been encountered.
//      */
//     public String getResolution() {
//         return resolution;
//     }
// 
// }
// 
// Path: yfiton-api/src/main/java/com/yfiton/api/exceptions/ParameterException.java
// public class ParameterException extends YfitonException {
// 
//     public ParameterException() {
//     }
// 
//     public ParameterException(String message) {
//         super(message);
//     }
// 
//     public ParameterException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public ParameterException(Throwable cause) {
//         super(cause);
//     }
// 
//     public ParameterException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// 
// }
// 
// Path: yfiton-api/src/main/java/com/yfiton/api/parameter/converters/Converter.java
// public interface Converter<T> {
// 
//     T convert(String parameterName, String parameterValue) throws ConversionException;
// 
// }
// 
// Path: yfiton-api/src/main/java/com/yfiton/api/parameter/validators/Validator.java
// public interface Validator<T> {
// 
//     /**
//      * Check whether the specified parameter {@code value} is valid. If not, a
//      * checked exception that contains the cause is thrown.
//      *
//      * @param parameterName  the name of the parameter to check.
//      * @param parameterValue the associated value to check.
//      * @throws ValidationException if the parameter value is invalid.
//      */
//     void validate(String parameterName, T parameterValue) throws ValidationException;
// 
// }


// Path: yfiton-api/src/main/java/com/yfiton/api/parameter/Parameter.java
import com.yfiton.api.exceptions.ConversionException;
import com.yfiton.api.exceptions.ParameterException;
import com.yfiton.api.parameter.converters.Converter;
import com.yfiton.api.parameter.validators.Validator;

        if (required != parameter.required) return false;
        if (!name.equals(parameter.name)) return false;
        if (!description.equals(parameter.description)) return false;
        if (!type.equals(parameter.type)) return false;
        if (!defaultValue.equals(parameter.defaultValue)) return false;
        if (!converter.equals(parameter.converter)) return false;
        return validator.equals(parameter.validator);

    }

    @Override
    public int hashCode() {
        int result = name.hashCode();
        result = 31 * result + description.hashCode();
        result = 31 * result + (hidden ? 1 : 0);
        result = 31 * result + (required ? 1 : 0);
        result = 31 * result + type.hashCode();
        result = 31 * result + defaultValue.hashCode();
        result = 31 * result + converter.hashCode();
        result = 31 * result + validator.hashCode();
        return result;
    }

    @Override
    public String toString() {
        return "Parameter{" +
                "name='" + name + '\'' +
                ", description='" + description + '\'' +
                ", hidden=" + hidden +
                ", required=" + required +
                ", type=" + type +