FunctionBuilder.java

package pro.verron.officestamper.core.functions;

import pro.verron.officestamper.api.CustomFunction;
import pro.verron.officestamper.core.DocxStamperConfiguration;

import java.util.List;
import java.util.function.Function;

/**
 * A builder class for creating and registering custom functions in the context of a {@code DocxStamperConfiguration}.
 * The custom functions are defined by a name, a single input parameter type, and their implementation.
 *
 * @param <T> the type of the input to the function
 */
public class FunctionBuilder<T>
        implements CustomFunction.NeedsFunctionImpl<T> {
    private final DocxStamperConfiguration source;
    private final String name;
    private final Class<T> class0;

    /**
     * Constructs a new {@code FunctionBuilder} to define and register a custom function in the provided {@code DocxStamperConfiguration}.
     *
     * @param source the {@code DocxStamperConfiguration} instance in which the custom function will be registered
     * @param name the name of the custom function to be defined
     * @param class0 the {@code Class} object representing the type of the single input parameter for the custom function
     */
    public FunctionBuilder(DocxStamperConfiguration source, String name, Class<T> class0) {
        this.source = source;
        this.name = name;
        this.class0 = class0;
    }

    /**
     * Sets the implementation for the custom function being built. The implementation defines
     * the behavior of the function for a specific input type and is wrapped in a
     * {@code CustomFunction} instance that is added to the configuration.
     *
     * @param implementation a {@code Function} that takes an input of type {@code T} and produces a result
     */
    @Override public void withImplementation(Function<T, ?> implementation) {
        Function<List<Object>, Object> objectFunction = args -> {
            var arg0 = class0.cast(args.getFirst());
            return implementation.apply(arg0);
        };
        var customFunction = new CustomFunction(name, List.of(class0), objectFunction);
        source.addCustomFunction(customFunction);
    }
}