package org.jtwig.value.config;
import org.apache.commons.lang3.builder.Builder;
import org.jtwig.util.builder.ListBuilder;
import org.jtwig.value.WrappedCollection;
import org.jtwig.value.compare.ValueComparator;
import org.jtwig.value.convert.Converter;
import org.jtwig.value.convert.string.StringConverter;
import java.math.BigDecimal;
import java.math.MathContext;
import java.math.RoundingMode;
public class ValueConfigurationBuilder<B extends ValueConfigurationBuilder> implements Builder<ValueConfiguration> {
private MathContext mathContext;
private RoundingMode roundingMode;
private final ListBuilder<B, Converter<Boolean>> booleanConverters;
private final ListBuilder<B, Converter<BigDecimal>> numberConverters;
private final ListBuilder<B, Converter<WrappedCollection>> collectionConverters;
private final ListBuilder<B, Converter<Character>> charConverters;
private ValueComparator valueComparator;
private StringConverter stringConverter;
public ValueConfigurationBuilder() {
this.booleanConverters = new ListBuilder<>(self());
this.numberConverters = new ListBuilder<>(self());
this.collectionConverters = new ListBuilder<>(self());
this.charConverters = new ListBuilder<>(self());
}
public ValueConfigurationBuilder(ValueConfiguration prototype) {
this.mathContext = prototype.getMathContext();
this.roundingMode = prototype.getRoundingMode();
this.valueComparator = prototype.getValueComparator();
this.stringConverter = prototype.getStringConverter();
this.booleanConverters = new ListBuilder<>(self(), prototype.getBooleanConverters());
this.numberConverters = new ListBuilder<>(self(), prototype.getNumberConverters());
this.collectionConverters = new ListBuilder<>(self(), prototype.getCollectionConverters());
this.charConverters = new ListBuilder<>(self(), prototype.getCharConverters());
}
public B withMathContext(MathContext mathContext) {
this.mathContext = mathContext;
return self();
}
public B withRoundingMode(RoundingMode roundingMode) {
this.roundingMode = roundingMode;
return self();
}
public ListBuilder<B, Converter<Boolean>> booleanConverters() {
return booleanConverters;
}
public ListBuilder<B, Converter<BigDecimal>> numberConverters() {
return numberConverters;
}
public ListBuilder<B, Converter<WrappedCollection>> collectionConverters() {
return collectionConverters;
}
public ListBuilder<B, Converter<Character>> charConverters() {
return charConverters;
}
public B withValueComparator(ValueComparator valueComparator) {
this.valueComparator = valueComparator;
return self();
}
public B withStringConverter(StringConverter stringConverter) {
this.stringConverter = stringConverter;
return self();
}
private B self() {
return (B) this;
}
@Override
public ValueConfiguration build() {
return new ValueConfiguration(mathContext, roundingMode, booleanConverters.build(),
numberConverters.build(), collectionConverters.build(),
charConverters.build(), valueComparator, stringConverter);
}
}