// Path: rulette-core/src/main/java/com/github/kislayverma/rulette/core/ruleinput/RuleInput.java
// public abstract class RuleInput implements Serializable {
//     private static final long serialVersionUID = 2370282382386651591L;
// 
//     protected RuleInputMetaData metaData;
//     protected String rawInput;
// 
//     protected RuleInput(String name, int priority, RuleInputType ruleInputType, 
//         String inputDataType, String rangeLowerBound, String rangeUpperBound) {
// 
//         this.metaData = new RuleInputMetaData(
//             name, priority, ruleInputType, inputDataType, rangeLowerBound, rangeUpperBound);
//         if (ruleInputType == RuleInputType.VALUE) {
//             this.rawInput = (rangeLowerBound == null ? "" : rangeLowerBound);
//         } else {
//             if (rangeLowerBound == null && rangeUpperBound == null) {
//                 this.rawInput = "";
//             } else {
//                 this.rawInput = (rangeLowerBound == null ? "" : rangeLowerBound) + "-" +
//                     (rangeUpperBound == null ? "" : rangeUpperBound);
//             }
//         }
//     }
// 
//     /**
//      * This method matches the given value against this rule input and returns true if it fits.
//      * For value inputs, match means either same value or 'Any'. For Range input, match means 
//      * 'Any' or the value should fall within the defined range of the input.
//      * @param value The value to compare against this input
//      * @return true if the value matches the input definition, false otherwise
//      */
//     public abstract boolean evaluate(String value);
// 
//     /**
//      * This method determines if this rule input conflicts with the given input. For value inputs,
//      * conflict means having the same value. For range inputs, conflict means having partially 
//      * overlapping range (e.g [1,5] and [2,10]). Ranges DO NOT conflict if one is completely 
//      * contained within the other.
//      * @param input The rule input to compare with
//      * @return true if inputs are conflicting
//      */
//     public abstract boolean isConflicting(RuleInput input);
// 
//     /**
//      * This method is used to determine if this rule input is a better than the given rule input
//      * for the same value. It assumes that both inputs match the value and that they are non-conflicting.
//      * 
//      * @param input The rule input to be matched against
//      * @return 0 if both input are identical in fit
//      *         1 if this input is a better fit
//      *         -1 if this input is not the better fit
//      */
//     public abstract int isBetterFit(RuleInput input);
// 
//     public final String getRawValue() {
//         return this.rawInput;
//     }
// 
//     public String getName() {
//         return this.metaData.getName();
//     }
// 
//     public int getPriority() {
//         return this.metaData.getPriority();
//     }
// 
//     public RuleInputType getRuleInputType() {
//         return this.metaData.getRuleInputType();
//     }
// 
//     public String getRuleInputDataType() {
//         return this.metaData.getDataType();
//     }
// 
//     /**
//      * This method returns true if this rule input is of the 'Any' (match all) type.
//      * 
//      * @return true if input is 'Any', false otherwise
//      */
//     public abstract boolean isAny();
// 
//     /**
//      * This method returns true if this input is exactly same as the given other input.
//      * 
//      * @param otherInput The rule input to compare against
//      * @return true if this and the given inputs are exactly same, false otherwise
//      */
//     public abstract boolean equals(RuleInput otherInput);
// 
//     @Override
//     public String toString() {
//         StringBuilder builder = new StringBuilder();
//         builder.append(this.metaData.getName())
//                 .append(":")
//                 .append(this.rawInput)
//                 .append("\t");
//         return builder.toString();
//     }
// }
// 
// Path: rulette-core/src/main/java/com/github/kislayverma/rulette/core/ruleinput/RuleInputValueFactory.java
// public class RuleInputValueFactory {
//     private static RuleInputValueFactory INSTANCE;
//     private final Map<String, IInputValueBuilder> builderMap;
//     private static final Logger LOGGER = LoggerFactory.getLogger(RuleInputValueFactory.class);
// 
//     private RuleInputValueFactory() {
//         LOGGER.info("Initializing input data type factory...");
//         this.builderMap = new ConcurrentHashMap<>();
//         LOGGER.info("Input data type factory initialized");
//     }
// 
//     public static RuleInputValueFactory getInstance() {
//         if (INSTANCE == null) {
//             INSTANCE = new RuleInputValueFactory();
//         }
// 
//         return INSTANCE;
//     }
// 
//     public IInputValue buildRuleInputVaue(String ruleInputName, String rawValue) {
// 
//         IInputValueBuilder builder = builderMap.get(ruleInputName);
//         if (builder == null) {
//             throw new IllegalArgumentException("No input value builder registered for input " + ruleInputName);
//         } else {
//             return builder.build(rawValue);
//         }
//     }
// 
//     public void registerRuleInputBuilder(String ruleInputName, IInputValueBuilder builder) {
//         builderMap.put(ruleInputName, builder);
//     }
// }
// 
// Path: rulette-core/src/main/java/com/github/kislayverma/rulette/core/ruleinput/value/IInputValue.java
// public interface IInputValue<T> {
//     String getDataType();
//     T getValue();
//     int compareTo(String obj);
//     int compareTo(IInputValue<T> obj);
//     boolean isEmpty();
// }


import com.github.kislayverma.rulette.core.ruleinput.RuleInput;
import com.github.kislayverma.rulette.core.ruleinput.RuleInputValueFactory;
import com.github.kislayverma.rulette.core.ruleinput.value.IInputValue;
import java.io.Serializable;
package com.github.kislayverma.rulette.core.ruleinput.type;


public class ValueInput extends RuleInput implements Serializable {
    private static final long serialVersionUID = -6340405995013946354L;

// Path: rulette-core/src/main/java/com/github/kislayverma/rulette/core/ruleinput/RuleInput.java
// public abstract class RuleInput implements Serializable {
//     private static final long serialVersionUID = 2370282382386651591L;
// 
//     protected RuleInputMetaData metaData;
//     protected String rawInput;
// 
//     protected RuleInput(String name, int priority, RuleInputType ruleInputType, 
//         String inputDataType, String rangeLowerBound, String rangeUpperBound) {
// 
//         this.metaData = new RuleInputMetaData(
//             name, priority, ruleInputType, inputDataType, rangeLowerBound, rangeUpperBound);
//         if (ruleInputType == RuleInputType.VALUE) {
//             this.rawInput = (rangeLowerBound == null ? "" : rangeLowerBound);
//         } else {
//             if (rangeLowerBound == null && rangeUpperBound == null) {
//                 this.rawInput = "";
//             } else {
//                 this.rawInput = (rangeLowerBound == null ? "" : rangeLowerBound) + "-" +
//                     (rangeUpperBound == null ? "" : rangeUpperBound);
//             }
//         }
//     }
// 
//     /**
//      * This method matches the given value against this rule input and returns true if it fits.
//      * For value inputs, match means either same value or 'Any'. For Range input, match means 
//      * 'Any' or the value should fall within the defined range of the input.
//      * @param value The value to compare against this input
//      * @return true if the value matches the input definition, false otherwise
//      */
//     public abstract boolean evaluate(String value);
// 
//     /**
//      * This method determines if this rule input conflicts with the given input. For value inputs,
//      * conflict means having the same value. For range inputs, conflict means having partially 
//      * overlapping range (e.g [1,5] and [2,10]). Ranges DO NOT conflict if one is completely 
//      * contained within the other.
//      * @param input The rule input to compare with
//      * @return true if inputs are conflicting
//      */
//     public abstract boolean isConflicting(RuleInput input);
// 
//     /**
//      * This method is used to determine if this rule input is a better than the given rule input
//      * for the same value. It assumes that both inputs match the value and that they are non-conflicting.
//      * 
//      * @param input The rule input to be matched against
//      * @return 0 if both input are identical in fit
//      *         1 if this input is a better fit
//      *         -1 if this input is not the better fit
//      */
//     public abstract int isBetterFit(RuleInput input);
// 
//     public final String getRawValue() {
//         return this.rawInput;
//     }
// 
//     public String getName() {
//         return this.metaData.getName();
//     }
// 
//     public int getPriority() {
//         return this.metaData.getPriority();
//     }
// 
//     public RuleInputType getRuleInputType() {
//         return this.metaData.getRuleInputType();
//     }
// 
//     public String getRuleInputDataType() {
//         return this.metaData.getDataType();
//     }
// 
//     /**
//      * This method returns true if this rule input is of the 'Any' (match all) type.
//      * 
//      * @return true if input is 'Any', false otherwise
//      */
//     public abstract boolean isAny();
// 
//     /**
//      * This method returns true if this input is exactly same as the given other input.
//      * 
//      * @param otherInput The rule input to compare against
//      * @return true if this and the given inputs are exactly same, false otherwise
//      */
//     public abstract boolean equals(RuleInput otherInput);
// 
//     @Override
//     public String toString() {
//         StringBuilder builder = new StringBuilder();
//         builder.append(this.metaData.getName())
//                 .append(":")
//                 .append(this.rawInput)
//                 .append("\t");
//         return builder.toString();
//     }
// }
// 
// Path: rulette-core/src/main/java/com/github/kislayverma/rulette/core/ruleinput/RuleInputValueFactory.java
// public class RuleInputValueFactory {
//     private static RuleInputValueFactory INSTANCE;
//     private final Map<String, IInputValueBuilder> builderMap;
//     private static final Logger LOGGER = LoggerFactory.getLogger(RuleInputValueFactory.class);
// 
//     private RuleInputValueFactory() {
//         LOGGER.info("Initializing input data type factory...");
//         this.builderMap = new ConcurrentHashMap<>();
//         LOGGER.info("Input data type factory initialized");
//     }
// 
//     public static RuleInputValueFactory getInstance() {
//         if (INSTANCE == null) {
//             INSTANCE = new RuleInputValueFactory();
//         }
// 
//         return INSTANCE;
//     }
// 
//     public IInputValue buildRuleInputVaue(String ruleInputName, String rawValue) {
// 
//         IInputValueBuilder builder = builderMap.get(ruleInputName);
//         if (builder == null) {
//             throw new IllegalArgumentException("No input value builder registered for input " + ruleInputName);
//         } else {
//             return builder.build(rawValue);
//         }
//     }
// 
//     public void registerRuleInputBuilder(String ruleInputName, IInputValueBuilder builder) {
//         builderMap.put(ruleInputName, builder);
//     }
// }
// 
// Path: rulette-core/src/main/java/com/github/kislayverma/rulette/core/ruleinput/value/IInputValue.java
// public interface IInputValue<T> {
//     String getDataType();
//     T getValue();
//     int compareTo(String obj);
//     int compareTo(IInputValue<T> obj);
//     boolean isEmpty();
// }


// Path: rulette-core/src/main/java/com/github/kislayverma/rulette/core/ruleinput/type/ValueInput.java
import com.github.kislayverma.rulette.core.ruleinput.RuleInput;
import com.github.kislayverma.rulette.core.ruleinput.RuleInputValueFactory;
import com.github.kislayverma.rulette.core.ruleinput.value.IInputValue;
import java.io.Serializable;

package com.github.kislayverma.rulette.core.ruleinput.type;


public class ValueInput extends RuleInput implements Serializable {
    private static final long serialVersionUID = -6340405995013946354L;

    private final IInputValue value;