package tc.oc.parse;

import com.google.inject.TypeLiteral;
import tc.oc.commons.core.inject.KeyedManifest;
import tc.oc.commons.core.util.Pair;
import tc.oc.parse.xml.NodeParser;
import tc.oc.parse.xml.PrimitiveNodeParser;

/**
 * Binds {@link Parser<T>} to the given type, and {@link NodeParser<T>} to {@link PrimitiveNodeParser<T>}
 */
public class PrimitiveParserManifest<T> extends KeyedManifest implements ParserTypeLiterals {

    private final TypeLiteral<T> T;
    private final TypeLiteral<? extends Parser<T>> ParserTImpl;

    public PrimitiveParserManifest(Class<T> type, Class<? extends Parser<T>> ParserTImpl) {
        this(TypeLiteral.get(type), TypeLiteral.get(ParserTImpl));
    }

    public PrimitiveParserManifest(TypeLiteral<T> T, TypeLiteral<? extends Parser<T>> ParserTImpl) {
        this.T = T;
        this.ParserTImpl = ParserTImpl;
    }

    @Override
    protected Object manifestKey() {
        return Pair.of(T, ParserTImpl);
    }

    @Override
    protected void configure() {
        bind(ParserTImpl);
        bind(Parser(T)).to(ParserTImpl);
        bind(NodeParser(T)).to(PrimitiveNodeParser(T));
        bind(ElementParser(T)).to(NodeParser(T));
        bind(DocumentParser(T)).to(NodeParser(T));
    }
}
