package tc.oc.pgm.xml.parser; import com.google.common.reflect.TypeParameter; import com.google.common.reflect.TypeToken; import com.google.inject.TypeLiteral; import org.jdom2.Element; import tc.oc.commons.core.reflect.Types; import tc.oc.pgm.xml.InvalidXMLException; import tc.oc.pgm.xml.Node; /** * A parser of exclusively {@link Element}s. Trying to parse any other * {@link Node} will cause an error. */ public interface ElementParser<T> extends Parser<T> { T parseElement(Element element) throws InvalidXMLException; @Override default T parseInternal(Node node) throws InvalidXMLException { return parseElement(node.asElement()); } static <T> TypeToken<ElementParser<T>> typeOf(TypeToken<T> type) { return new TypeToken<ElementParser<T>>(){}.where(new TypeParameter<T>(){}, type); } static <T> TypeLiteral<ElementParser<T>> typeOf(TypeLiteral<T> type) { return Types.toLiteral(typeOf(Types.toToken(type))); } }