1
mirror of https://github.com/CarmJos/EasyConfiguration.git synced 2026-06-04 18:48:20 +08:00

feat(value): 支持对Enum对象的快速解析

This commit is contained in:
2023-06-23 14:06:56 +08:00
parent 3a0a8e79b9
commit eee4a278d9
20 changed files with 111 additions and 111 deletions
@@ -46,7 +46,10 @@ public class ConfigValueBuilder<V> {
return from(
Object.class, ConfigDataFunction.identity(),
ConfigValueParser.castObject(valueClass),
ConfigDataFunction.toObject(), ConfigDataFunction.toObject()
s -> {
if (s instanceof Enum<?>) return ((Enum<?>) s).name();
else return s;
}, ConfigDataFunction.toObject()
);
}
@@ -13,34 +13,34 @@ public interface ConfigDataFunction<T, R> {
default <V> @NotNull ConfigDataFunction<T, V> andThen(@NotNull ConfigDataFunction<? super R, V> after) {
Objects.requireNonNull(after);
return ((data) -> after.parse(parse(data)));
return data -> after.parse(parse(data));
}
@Contract(pure = true)
static <T> @NotNull ConfigDataFunction<T, T> identity() {
return (input) -> input;
return input -> input;
}
@Contract(pure = true)
static <T> @NotNull ConfigDataFunction<T, T> identity(Class<T> type) {
return (input) -> input;
return input -> input;
}
@Contract(pure = true)
static <T, V> @NotNull ConfigDataFunction<T, V> required() {
return (input) -> {
return input -> {
throw new IllegalArgumentException("Please specify the value parser.");
};
}
@Contract(pure = true)
static <T> @NotNull ConfigDataFunction<T, Object> toObject() {
return (input) -> input;
return input -> input;
}
@Contract(pure = true)
static <V> @NotNull ConfigDataFunction<Object, V> castObject(Class<V> valueClass) {
return (input) -> {
return input -> {
if (valueClass.isInstance(input)) return valueClass.cast(input);
else throw new IllegalArgumentException("Cannot cast value to " + valueClass.getName());
};
@@ -48,7 +48,7 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static <V> @NotNull ConfigDataFunction<String, V> castFromString(Class<V> valueClass) {
return (input) -> {
return input -> {
if (valueClass.isInstance(input)) return valueClass.cast(input);
else throw new IllegalArgumentException("Cannot cast string to " + valueClass.getName());
};
@@ -56,15 +56,16 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static <T> @NotNull ConfigDataFunction<T, String> castToString() {
return (input) -> {
return input -> {
if (input instanceof String) return (String) input;
else if (input instanceof Enum<?>) return ((Enum<?>) input).name();
else return input.toString();
};
}
@Contract(pure = true)
static <V> @NotNull ConfigDataFunction<String, V> parseString(Class<V> valueClass) {
return (input) -> {
return input -> {
if (valueClass.isInstance(input)) return valueClass.cast(input);
else throw new IllegalArgumentException("Cannot cast string to " + valueClass.getName());
};
@@ -72,7 +73,7 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static @NotNull ConfigDataFunction<Object, Integer> intValue() {
return (input) -> {
return input -> {
if (input instanceof Integer) {
return (Integer) input;
} else if (input instanceof Number) {
@@ -83,7 +84,7 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static @NotNull ConfigDataFunction<Object, Short> shortValue() {
return (input) -> {
return input -> {
if (input instanceof Short) {
return (Short) input;
} else if (input instanceof Number) {
@@ -94,7 +95,7 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static @NotNull ConfigDataFunction<Object, Double> doubleValue() {
return (input) -> {
return input -> {
if (input instanceof Double) {
return (Double) input;
} else if (input instanceof Number) {
@@ -105,7 +106,7 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static @NotNull ConfigDataFunction<Object, Byte> byteValue() {
return (input) -> {
return input -> {
if (input instanceof Byte) {
return (Byte) input;
} else if (input instanceof Number) {
@@ -116,7 +117,7 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static @NotNull ConfigDataFunction<Object, Float> floatValue() {
return (input) -> {
return input -> {
if (input instanceof Float) {
return (Float) input;
} else if (input instanceof Number) {
@@ -127,7 +128,7 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static @NotNull ConfigDataFunction<Object, Long> longValue() {
return (input) -> {
return input -> {
if (input instanceof Long) {
return (Long) input;
} else if (input instanceof Number) {
@@ -138,14 +139,14 @@ public interface ConfigDataFunction<T, R> {
@Contract(pure = true)
static @NotNull ConfigDataFunction<Object, Boolean> booleanValue() {
return (input) -> {
return input -> {
if (input instanceof Boolean) {
return (Boolean) input;
} else if (input instanceof String) {
String s = (String) input;
return Boolean.parseBoolean(s) || "yes".equalsIgnoreCase(s);
} else if (input instanceof Integer) {
return ((Integer) input) == 1;
return (Integer) input == 1;
} else throw new IllegalArgumentException("Cannot cast value to " + Boolean.class.getName());
};
}
@@ -67,6 +67,9 @@ public interface ConfigValueParser<T, R> {
}
} else if (Boolean.class.isAssignableFrom(valueClass)) {
input = booleanValue().parse(input, (Boolean) defaultValue);
} else if (Enum.class.isAssignableFrom(valueClass) && input instanceof String) {
String enumName = (String) input;
input = valueClass.getDeclaredMethod("valueOf", String.class).invoke(null, enumName);
}
if (valueClass.isInstance(input)) return valueClass.cast(input);
@@ -125,6 +128,21 @@ public interface ConfigValueParser<T, R> {
return (input, defaultValue) -> ConfigDataFunction.booleanValue().parse(input);
}
@Contract(pure = true)
static @NotNull <E extends Enum<E>> ConfigValueParser<Object, E> enumValue(Class<E> enumClass) {
return (input, defaultValue) -> {
if (input instanceof Enum) {
return enumClass.cast(input);
} else if (input instanceof String) {
return Enum.valueOf(enumClass, (String) input);
} else if (input instanceof Number) {
return enumClass.getEnumConstants()[((Number) input).intValue()];
} else {
throw new IllegalArgumentException("Cannot cast value to " + enumClass.getName());
}
};
}
}