package tc.oc.pgm.xml.parser;
import javax.inject.Inject;
import com.google.common.collect.Range;
import com.google.inject.TypeLiteral;
import tc.oc.commons.core.reflect.Types;
import tc.oc.commons.core.util.Ranges;
import tc.oc.pgm.xml.InvalidXMLException;
import tc.oc.pgm.xml.Node;
public class RangeParser<N extends Comparable<N>> extends PrimitiveParser<Range<N>> {
private final PrimitiveParser<N> domainParser;
@Inject private RangeParser(TypeLiteral<N> domainType, PrimitiveParser<N> domainParser) {
super(Ranges.typeOf(Types.toToken(domainType)));
this.domainParser = domainParser;
}
@Override
protected Range<N> parseInternal(Node node, String text) throws FormatException, InvalidXMLException {
final String[] parts = text.split("\\.\\.");
switch(parts.length) {
case 1: return Range.singleton(domainParser.parse(node, text));
case 2: return Range.closed(domainParser.parse(node, parts[0]),
domainParser.parse(node, parts[1]));
}
throw new FormatException();
}
}