EnumParserImpl.java
package io.github.jonloucks.variants.impl;
import java.util.function.Function;
import static io.github.jonloucks.contracts.api.Checks.nullCheck;
import static io.github.jonloucks.variants.api.Checks.textCheck;
import static java.lang.Character.isDigit;
final class EnumParserImpl<T extends Enum<T>> {
EnumParserImpl(Class<T> enumClass) {
this.enumClass = nullCheck(enumClass, "Enum class must be present.");
this.constants = nullCheck(enumClass.getEnumConstants(), "Unsupported enum class.");
}
Function<CharSequence, T> compile() {
return chars -> {
final CharSequence validChars = textCheck(chars);
if (validChars.length() == 0) {
throw new IllegalArgumentException("Enum text must not be empty.");
}
try {
if (isDigit(validChars.charAt(0))) {
return constants[Integer.parseInt(validChars.toString())];
} else {
return Enum.valueOf(enumClass, validChars.toString());
}
} catch (Exception thrown) {
throw new IllegalArgumentException("Invalid " + enumClass.getSimpleName() + " value '" + validChars + "'.", thrown);
}
};
}
private final Class<T> enumClass;
private final T[] constants;
}