package org.jtwig.render.config;
import org.apache.commons.lang3.builder.Builder;
import org.jtwig.model.expression.Expression;
import org.jtwig.model.expression.test.TestExpression;
import org.jtwig.model.tree.Node;
import org.jtwig.render.expression.calculator.ExpressionCalculator;
import org.jtwig.render.expression.calculator.operation.binary.BinaryOperator;
import org.jtwig.render.expression.calculator.operation.binary.calculators.BinaryOperationCalculator;
import org.jtwig.render.expression.calculator.operation.unary.UnaryOperator;
import org.jtwig.render.expression.calculator.operation.unary.calculators.UnaryOperationCalculator;
import org.jtwig.render.expression.test.calculator.TestExpressionCalculator;
import org.jtwig.render.node.renderer.NodeRender;
import org.jtwig.util.builder.MapBuilder;
import java.nio.charset.Charset;
public class RenderConfigurationBuilder<B extends RenderConfigurationBuilder> implements Builder<RenderConfiguration> {
private boolean strictMode;
private Charset outputCharset;
private final MapBuilder<B, Class<? extends Node>, NodeRender> nodeRenders;
private final MapBuilder<B, Class<? extends Expression>, ExpressionCalculator> expressionCalculators;
private final MapBuilder<B, Class<? extends BinaryOperator>, BinaryOperationCalculator> binaryExpressionCalculators;
private final MapBuilder<B, Class<? extends UnaryOperator>, UnaryOperationCalculator> unaryExpressionCalculators;
private final MapBuilder<B, Class<? extends TestExpression>, TestExpressionCalculator> testExpressionCalculators;
public RenderConfigurationBuilder() {
nodeRenders = new MapBuilder<>(self());
this.expressionCalculators = new MapBuilder<>(self());
this.binaryExpressionCalculators = new MapBuilder<>(self());
this.unaryExpressionCalculators = new MapBuilder<>(self());
this.testExpressionCalculators = new MapBuilder<>(self());
}
public RenderConfigurationBuilder(RenderConfiguration prototype) {
this.strictMode = prototype.getStrictMode();
this.outputCharset = prototype.getDefaultOutputCharset();
this.nodeRenders = new MapBuilder<>(self(), prototype.getNodeRenders());
this.expressionCalculators = new MapBuilder<>(self(), prototype.getExpressionCalculators());
this.binaryExpressionCalculators = new MapBuilder<>(self(), prototype.getBinaryExpressionCalculators());
this.unaryExpressionCalculators = new MapBuilder<>(self(), prototype.getUnaryExpressionCalculators());
this.testExpressionCalculators = new MapBuilder<>(self(), prototype.getTestExpressionCalculators());
}
public B withStrictMode(boolean strictMode) {
this.strictMode = strictMode;
return self();
}
public B withOutputCharset(Charset outputCharset) {
this.outputCharset = outputCharset;
return self();
}
public MapBuilder<B, Class<? extends Node>, NodeRender> nodeRenders () {
return nodeRenders;
}
public MapBuilder<B, Class<? extends Expression>, ExpressionCalculator> expressionCalculators() {
return expressionCalculators;
}
public MapBuilder<B, Class<? extends BinaryOperator>, BinaryOperationCalculator> binaryExpressionCalculators() {
return binaryExpressionCalculators;
}
public MapBuilder<B, Class<? extends UnaryOperator>, UnaryOperationCalculator> unaryExpressionCalculators() {
return unaryExpressionCalculators;
}
public MapBuilder<B, Class<? extends TestExpression>, TestExpressionCalculator> testExpressionCalculators() {
return testExpressionCalculators;
}
protected B self () {
return (B) this;
}
@Override
public RenderConfiguration build() {
return new RenderConfiguration(strictMode, outputCharset,
nodeRenders.build(),
expressionCalculators.build(),
binaryExpressionCalculators.build(),
unaryExpressionCalculators.build(),
testExpressionCalculators.build());
}
}