TemplateMoney.java
package org.freshmarker.money;
import ftl.Token.TokenType;
import org.freshmarker.core.ProcessContext;
import org.freshmarker.core.ProcessException;
import org.freshmarker.core.model.DotHashAddressable;
import org.freshmarker.core.model.TemplateObject;
import org.freshmarker.core.model.primitive.TemplateNumber;
import org.freshmarker.core.model.primitive.TemplatePrimitive;
import org.javamoney.moneta.Money;
import org.javamoney.moneta.spi.JDKCurrencyAdapter;
import org.javamoney.moneta.spi.MoneyUtils;
public class TemplateMoney extends TemplatePrimitive<Money> implements DotHashAddressable {
public TemplateMoney(Money value) {
super(value);
}
@Override
public TemplateObject operation(TokenType operator, TemplateObject operand, ProcessContext context) {
TemplateMoney money = operand.evaluate(context, TemplateMoney.class);
try {
return switch (operator) {
case PLUS -> new TemplateMoney(getValue().add(money.getValue()));
case MINUS -> new TemplateMoney(getValue().subtract(money.getValue()));
default -> super.operation(operator, operand, context);
};
} catch (RuntimeException e) {
throw new ProcessException(e.getMessage(), e);
}
}
@Override
public TemplatePrimitive<?> relational(TokenType operator, TemplatePrimitive<?> operand, ProcessContext context) {
Money money = operand.evaluate(context, TemplateMoney.class).getValue();
try {
MoneyUtils.checkAmountParameter(money, getValue().getCurrency());
} catch (RuntimeException e) {
throw new ProcessException(e.getMessage(), e);
}
return compareValues(operator, getValue().compareTo(money));
}
@Override
public TemplateObject get(ProcessContext context, String name) {
return switch (name) {
case "amount" -> new TemplateNumber(getValue().getNumberStripped());
case "currency" -> new TemplateConcurrency(((JDKCurrencyAdapter)getValue().getCurrency()));
default -> throw new ProcessException("unknown attribute: " + name);
};
}
}