package tc.oc.pgm.xml.parser; import com.google.inject.Key; import com.google.inject.TypeLiteral; import com.google.inject.binder.LinkedBindingBuilder; import tc.oc.commons.core.inject.Binders; import tc.oc.commons.core.reflect.ResolvableType; import tc.oc.commons.core.reflect.TypeArgument; import tc.oc.commons.core.reflect.Types; public interface ParserBinders extends Binders { default <T> LinkedBindingBuilder<Parser<T>> bindParser(Key<T> key) { return bind(key.ofType(Types.parameterizedTypeLiteral(Parser.class, key.getTypeLiteral()))); } default <T> LinkedBindingBuilder<Parser<T>> bindParser(TypeLiteral<T> type) { return bindParser(Key.get(type)); } default <T> LinkedBindingBuilder<Parser<T>> bindParser(Class<T> type) { return bindParser(Key.get(type)); } default <T> LinkedBindingBuilder<PrimitiveParser<T>> bindPrimitiveParser(Key<T> key) { final Key<PrimitiveParser<T>> parserKey = key.ofType(PrimitiveParser.typeOf(key.getTypeLiteral())); bindParser(key).to(parserKey); return bind(parserKey); } default <T> LinkedBindingBuilder<PrimitiveParser<T>> bindPrimitiveParser(TypeLiteral<T> type) { return bindPrimitiveParser(Key.get(type)); } default <T> LinkedBindingBuilder<PrimitiveParser<T>> bindPrimitiveParser(Class<T> type) { return bindPrimitiveParser(Key.get(type)); } default <T> LinkedBindingBuilder<ElementParser<T>> bindElementParser(Key<T> key) { final Key<ElementParser<T>> parserKey = key.ofType(new ResolvableType<ElementParser<T>>(){}.with(new TypeArgument<T>(key.getTypeLiteral()){})); bindParser(key).to(parserKey); return bind(parserKey); } default <T> LinkedBindingBuilder<ElementParser<T>> bindElementParser(TypeLiteral<T> type) { return bindElementParser(Key.get(type)); } default <T> LinkedBindingBuilder<ElementParser<T>> bindElementParser(Class<T> type) { return bindElementParser(Key.get(type)); } }