MonetaExtension.java

package org.freshmarker.money;

import org.freshmarker.api.Formatter;
import org.freshmarker.api.TypeMapper;
import org.freshmarker.api.extension.BuiltInProvider;
import org.freshmarker.api.extension.FormatterProvider;
import org.freshmarker.api.extension.Register;
import org.freshmarker.api.extension.TypeMapperProvider;
import org.freshmarker.api.extension.support.BuiltInRegister;
import org.freshmarker.core.model.TemplateObject;
import org.freshmarker.core.model.primitive.TemplateNumber;
import org.javamoney.moneta.Money;
import org.javamoney.moneta.spi.JDKCurrencyAdapter;

import java.util.Map;

public final class MonetaExtension implements BuiltInProvider, TypeMapperProvider, FormatterProvider {

    @Override
    public Register<Class<? extends TemplateObject>, String, org.freshmarker.api.BuiltIn> provideBuiltInRegister() {
        BuiltInRegister register = new BuiltInRegister();
        register.add(TemplateMoney.class, "currency", (x, y, e) -> new TemplateConcurrency((JDKCurrencyAdapter) ((TemplateMoney) x).getValue().getCurrency()));
        register.add(TemplateMoney.class, "amount", (x, y, e) -> new TemplateNumber(((TemplateMoney) x).getValue().getNumberStripped()));
        return register;
    }

    @Override
    public Map<Class<?>, TypeMapper> providerTypeMapper() {
        return Map.of(
                Money.class, o -> new TemplateMoney((Money) o),
                JDKCurrencyAdapter.class, o -> new TemplateConcurrency((JDKCurrencyAdapter) o));
    }

    @Override
    public Map<Class<? extends TemplateObject>, Formatter> providerFormatter() {
        return Map.of(TemplateMoney.class, new MonetaryFormatter());
    }
}