package org.jtwig.functions.environment;
import org.jtwig.exceptions.InvalidFunctionNameException;
import org.jtwig.functions.FunctionRequestFactory;
import org.jtwig.functions.JtwigFunction;
import org.jtwig.functions.resolver.CoreFunctionResolver;
import org.jtwig.functions.resolver.FunctionResolver;
import org.jtwig.functions.resolver.FunctionValueSupplierFactory;
import java.util.Collection;
import java.util.HashMap;
public class FunctionResolverFactory {
public static final String IDENTIFIER_PATTERN = "[A-Za-z_$][A-Za-z0-9_$]*";
public FunctionResolver create(Collection<JtwigFunction> functions) {
HashMap<String, JtwigFunction> map = new HashMap<>();
for (JtwigFunction jtwigFunction : functions) {
validate(jtwigFunction.name());
map.put(jtwigFunction.name(), jtwigFunction);
for (String alias : jtwigFunction.aliases()) {
validate(alias);
map.put(alias, jtwigFunction);
}
}
return new CoreFunctionResolver(map, new FunctionRequestFactory(), new FunctionValueSupplierFactory());
}
private void validate(String name) {
if (!name.matches(IDENTIFIER_PATTERN)) {
throw new InvalidFunctionNameException(String.format("Function name %s is invalid, it should be an identifier (regular expression: %s)", name, IDENTIFIER_PATTERN));
}
}
}