package tc.oc.pgm.xml.parser;
import javax.inject.Inject;
import com.google.common.cache.LoadingCache;
import org.bukkit.util.ImVector;
import tc.oc.commons.core.util.CacheUtils;
import tc.oc.pgm.xml.InvalidXMLException;
import tc.oc.pgm.xml.Node;
public class VectorParser<T extends Number> extends PrimitiveParser<ImVector> {
private static final LoadingCache<Class<? extends Number>, VectorParser<?>> byType = CacheUtils.newCache(
componentType -> new VectorParser<>(NumberParser.get(componentType))
);
@Deprecated // @Inject me!
public static <T extends Number> VectorParser<T> get(Class<T> type) {
return (VectorParser<T>) byType.getUnchecked(type);
}
private final NumberParser<T> componentParser;
@Inject private VectorParser(NumberParser<T> componentParser) {
this.componentParser = componentParser;
}
@Override
public ImVector parseInternal(Node node, String text) throws FormatException, InvalidXMLException {
String[] components = text.trim().split("\\s*,\\s*");
if(components.length != 3) throw new FormatException();
try {
return ImVector.of(componentParser.parse(node, components[0]).doubleValue(),
componentParser.parse(node, components[1]).doubleValue(),
componentParser.parse(node, components[2]).doubleValue());
} catch(NumberFormatException e) {
throw new FormatException();
}
}
}