package io.katharsis.utils.parser;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
/**
* Parsers for standard Java types.
*/
public final class StandardTypeParsers {
public static final Map<Class, StandardTypeParser> parsers = new HashMap<>();
static {
addType(asList(Byte.class, byte.class), new StandardTypeParser<Byte>() {
@Override
public Byte parse(String input) {
return Byte.valueOf(input);
}
});
addType(asList(Short.class, short.class), new StandardTypeParser<Short>() {
@Override
public Short parse(String input) {
return Short.valueOf(input);
}
});
addType(asList(Integer.class, int.class), new StandardTypeParser<Integer>() {
@Override
public Integer parse(String input) {
return Integer.valueOf(input);
}
});
addType(asList(Long.class, long.class), new StandardTypeParser<Long>() {
@Override
public Long parse(String input) {
return Long.valueOf(input);
}
});
addType(asList(Float.class, float.class), new StandardTypeParser<Float>() {
@Override
public Float parse(String input) {
return Float.valueOf(input);
}
});
addType(asList(Double.class, double.class), new StandardTypeParser<Double>() {
@Override
public Double parse(String input) {
return Double.valueOf(input);
}
});
addType(singletonList(BigInteger.class), new StandardTypeParser<BigInteger>() {
@Override
public BigInteger parse(String input) {
return new BigInteger(input);
}
});
addType(singletonList(BigDecimal.class), new StandardTypeParser<BigDecimal>() {
@Override
public BigDecimal parse(String input) {
return new BigDecimal(input);
}
});
addType(asList(Character.class, char.class), new StandardTypeParser<Character>() {
@Override
public Character parse(String input) {
if (input.length() != 1) {
throwException(Character.class, input);
}
return input.charAt(0);
}
});
addType(asList(Boolean.class, boolean.class), new StandardTypeParser<Boolean>() {
@Override
public Boolean parse(String input) {
String inputNormalized = input.toLowerCase();
if ("true".equals(inputNormalized) || "t".equals(inputNormalized)) {
return true;
} else if ("false".equals(inputNormalized) || "f".equals(inputNormalized)) {
return false;
} else {
throwException(Boolean.class, input);
}
return false;
}
});
addType(Collections.singletonList(UUID.class), new StandardTypeParser<UUID>() {
@Override
public UUID parse(String input) {
return UUID.fromString(input);
}
});
}
private static <T> void addType(List<Class<T>> classes, StandardTypeParser<T> standardTypeParser) {
for (Class<T> clazz : classes) {
parsers.put(clazz, standardTypeParser);
}
}
private static void throwException(Class clazz, String input) {
throw new IllegalArgumentException(String.format("String cannot be casted to %s: %s", clazz, input));
}
}