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);
        };
    }
}