package org.jtwig.parser.config;
import com.google.common.base.Optional;
import org.apache.commons.lang3.builder.Builder;
import org.jtwig.parser.addon.AddonParserProvider;
import org.jtwig.parser.cache.TemplateCache;
import org.jtwig.parser.parboiled.expression.test.TestExpressionParser;
import org.jtwig.render.expression.calculator.operation.binary.BinaryOperator;
import org.jtwig.render.expression.calculator.operation.unary.UnaryOperator;
import org.jtwig.util.builder.ListBuilder;
import org.jtwig.util.builder.MapBuilder;
public class JtwigParserConfigurationBuilder<B extends JtwigParserConfigurationBuilder> implements Builder<JtwigParserConfiguration> {
private AndSyntaxConfigurationBuilder<B> syntaxConfiguration;
private final ListBuilder<B, AddonParserProvider> addonParserProviders;
private final ListBuilder<B, UnaryOperator> unaryOperators;
private final ListBuilder<B, BinaryOperator> binaryOperators;
private final ListBuilder<B, Class<? extends TestExpressionParser>> testExpressionParsers;
private Optional<TemplateCache> templateCache;
private final MapBuilder<B, String, Object> properties;
public JtwigParserConfigurationBuilder () {
this.syntaxConfiguration = new AndSyntaxConfigurationBuilder<>(self());
this.addonParserProviders = new ListBuilder<>(self());
this.unaryOperators = new ListBuilder<>(self());
this.binaryOperators = new ListBuilder<>(self());
this.testExpressionParsers = new ListBuilder<>(self());
this.properties = new MapBuilder<>(self());
}
public JtwigParserConfigurationBuilder (JtwigParserConfiguration prototype) {
this.syntaxConfiguration = new AndSyntaxConfigurationBuilder<>(self(), prototype.getSyntaxConfiguration());
this.addonParserProviders = new ListBuilder<>(self(), prototype.getAddonParserProviders());
this.unaryOperators = new ListBuilder<>(self(), prototype.getUnaryOperators());
this.binaryOperators = new ListBuilder<>(self(), prototype.getBinaryOperators());
this.testExpressionParsers = new ListBuilder<>(self(), prototype.getTestExpressionParsers());
this.templateCache = prototype.getTemplateCache();
this.properties = new MapBuilder<>(self(), prototype.getProperties());
}
public AndSyntaxConfigurationBuilder<B> syntax () {
return syntaxConfiguration;
}
public B withTemplateCache(TemplateCache templateCache) {
this.templateCache = Optional.fromNullable(templateCache);
return self();
}
public B withoutTemplateCache() {
this.templateCache = Optional.absent();
return self();
}
public ListBuilder<B, AddonParserProvider> addonParserProviders() {
return addonParserProviders;
}
public ListBuilder<B, UnaryOperator> unaryOperators() {
return unaryOperators;
}
public ListBuilder<B, BinaryOperator> binaryOperators() {
return binaryOperators;
}
public ListBuilder<B, Class<? extends TestExpressionParser>> testExpressionParsers() {
return testExpressionParsers;
}
public MapBuilder<B, String, Object> properties() {
return properties;
}
protected B self () {
return (B) this;
}
@Override
public JtwigParserConfiguration build() {
return new JtwigParserConfiguration(syntaxConfiguration.build(), addonParserProviders.build(), unaryOperators.build(), binaryOperators.build(), testExpressionParsers.build(), templateCache, properties.build());
}
}