package tc.oc.pgm.xml.parser;
import javax.annotation.Nullable;
import com.google.common.collect.Range;
import com.google.inject.TypeLiteral;
import tc.oc.commons.core.inject.KeyedManifest;
import tc.oc.commons.core.reflect.ResolvableType;
import tc.oc.commons.core.reflect.TypeArgument;
import tc.oc.commons.core.util.Ranges;
import tc.oc.pgm.xml.property.PropertyManifest;
import tc.oc.pgm.xml.property.RangeProperty;
public class RangeParserManifest<T extends Comparable<T>> extends KeyedManifest implements ParserBinders {
private final TypeLiteral<T> type;
private TypeArgument<T> typeArg;
protected RangeParserManifest() {
this(null);
}
public RangeParserManifest(@Nullable TypeLiteral<T> type) {
this.type = type != null ? type : new ResolvableType<T>(){}.in(getClass());
this.typeArg = new TypeArgument<T>(this.type){};
}
@Override
protected Object manifestKey() {
return type;
}
@Override
protected void configure() {
final TypeLiteral<Range<T>> rangeType = Ranges.typeOf(type);
final TypeLiteral<RangeParser<T>> rangeParserType = new ResolvableType<RangeParser<T>>(){}.with(typeArg);
final TypeLiteral<RangeProperty<T>> rangePropertyType = new ResolvableType<RangeProperty<T>>(){}.with(typeArg);
bindPrimitiveParser(rangeType).to(rangeParserType); // NodeParser<Range<T>> -> RangeParser<T>
bind(rangeParserType); // RangeParser<T>
install(new PropertyManifest<>(rangeType, rangePropertyType));
}
}