package org.cryptocoinpartners.command; import java.math.BigDecimal; import javax.inject.Inject; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.commons.lang.StringUtils; import org.cryptocoinpartners.enumeration.PositionEffect; import org.cryptocoinpartners.schema.Currency; import org.cryptocoinpartners.schema.Listing; import org.cryptocoinpartners.schema.Market; /** * This helper utility converts Antlr TerminalNodes into Cointrader schema classes * * @author Tim Olson */ public class Parse { @Inject static Market markets; public static BigDecimal amount(TerminalNode node) throws ParseError { String text = text(node); if (StringUtils.isBlank(text)) throw new ParseError("Expected an amount"); try { return new BigDecimal(text); } catch (NumberFormatException e) { throw new ParseError("Expected an amount: " + text); } } public static Currency currency(TerminalNode node) throws ParseError { String text = text(node); Currency currency = Currency.forSymbol(text); if (currency == null) throw new ParseError("Unknown currency " + text); return currency; } public static Listing listing(TerminalNode node) throws ParseError { String text = text(node); Listing listing = Listing.forSymbol(text); if (listing == null) throw new ParseError("Unknown listing " + text); return listing; } public static PositionEffect positionEffect(TerminalNode node) throws ParseError { String text = text(node); PositionEffect positionEffect = (text.equals("close") || text.equals("Close") || text.equals("CLOSE")) ? PositionEffect.CLOSE : PositionEffect.OPEN; if (positionEffect == null) throw new ParseError("Unknown position effect " + text); return positionEffect; } public static Market market(TerminalNode node) throws ParseError { String text = text(node); Market market = markets.forSymbol(text); if (market == null) throw new ParseError("Unknown market " + text); return market; } private static String text(TerminalNode node) { return node == null ? "" : node.getSymbol().getText(); } }