Skip to content

Commit 43b8baf

Browse files
committed
fix config list/string handling
1 parent 7ca7a7a commit 43b8baf

File tree

6 files changed

+89
-60
lines changed

6 files changed

+89
-60
lines changed

src/main/java/com/falsepattern/lib/internal/impl/config/fields/AListConfigField.java

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -29,36 +29,50 @@
2929
import lombok.SneakyThrows;
3030
import lombok.val;
3131

32-
import net.minecraftforge.common.config.Configuration;
3332
import net.minecraftforge.common.config.Property;
3433

3534
import java.io.DataInput;
3635
import java.io.DataOutput;
3736
import java.io.IOException;
38-
import java.lang.reflect.Field;
37+
import java.lang.annotation.Annotation;
38+
import java.lang.reflect.Array;
3939
import java.util.Optional;
40+
import java.util.function.BiConsumer;
41+
import java.util.function.Function;
4042

41-
public abstract class AListConfigField<T> extends AConfigField<T> {
43+
public abstract class AListConfigField<T, E extends Annotation> extends AConfigField<T> {
4244
protected final boolean fixedLength;
4345
protected final int maxLength;
46+
protected final T defaultValue;
4447

45-
protected AListConfigField(ConfigFieldParameters params, Property.Type type)
48+
49+
protected AListConfigField(ConfigFieldParameters params,
50+
Property.Type type,
51+
Class<E> defaultAnnotation,
52+
Function<E, T> defaultValueGetter,
53+
BiConsumer<Property, T> defaultValueSetter
54+
)
4655
throws ConfigException {
4756
super(params, type, true);
4857
fixedLength = field.isAnnotationPresent(Config.ListFixedLength.class);
49-
maxLength = Optional.ofNullable(field.getAnnotation(Config.ListMaxLength.class))
50-
.map(Config.ListMaxLength::value)
51-
.orElse(256);
52-
if (maxLength < 0) {
53-
throw new ConfigException("Negative length list configurations are not supported!\n"
54-
+ "Field name: "
55-
+ field.getName()
56-
+ ", class: "
57-
+ field.getDeclaringClass().getName());
58-
}
5958
property.setIsListLengthFixed(fixedLength);
59+
defaultValue = Optional.ofNullable(field.getAnnotation(defaultAnnotation))
60+
.map(defaultValueGetter)
61+
.orElseThrow(() -> noDefault(field, defaultAnnotation.getSimpleName()));
62+
defaultValueSetter.accept(property, defaultValue);
63+
if (fixedLength) {
64+
maxLength = Array.getLength(defaultValue);
65+
} else {
66+
maxLength = Optional.ofNullable(field.getAnnotation(Config.ListMaxLength.class))
67+
.map(Config.ListMaxLength::value)
68+
.orElse(-1);
69+
}
6070
property.setMaxListLength(maxLength);
61-
property.comment += "\n[fixed length: " + (fixedLength ? "yes" : "no") + ", max length: " + maxLength + "]";
71+
if (fixedLength) {
72+
property.comment += "\n[fixed length: " + maxLength + "]";
73+
} else if (maxLength >= 0) {
74+
property.comment += "\n[max length: " + maxLength + "]";
75+
}
6276
}
6377

6478
protected abstract int length(T arr);

src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanListConfigField.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@
3737
import java.util.Arrays;
3838
import java.util.Optional;
3939

40-
public class BooleanListConfigField extends AListConfigField<boolean[]> {
41-
private final boolean[] defaultValue;
40+
public class BooleanListConfigField extends AListConfigField<boolean[], Config.DefaultBooleanList> {
4241

4342
public BooleanListConfigField(ConfigFieldParameters params) throws ConfigException {
44-
super(params, Property.Type.BOOLEAN);
45-
defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultBooleanList.class))
46-
.map(Config.DefaultBooleanList::value)
47-
.orElseThrow(() -> noDefault(field, "DefaultBooleanList"));
48-
property.setDefaultValues(defaultValue);
43+
super(params,
44+
Property.Type.BOOLEAN,
45+
Config.DefaultBooleanList.class,
46+
Config.DefaultBooleanList::value,
47+
Property::setDefaultValues
48+
);
4949
if (!property.isBooleanList()) {
5050
setToDefault();
5151
}

src/main/java/com/falsepattern/lib/internal/impl/config/fields/DoubleListConfigField.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,20 @@
3838
import java.util.Arrays;
3939
import java.util.Optional;
4040

41-
public class DoubleListConfigField extends AListConfigField<double[]> {
41+
public class DoubleListConfigField extends AListConfigField<double[], Config.DefaultDoubleList> {
4242
private final double min;
4343
private final double max;
44-
private final double[] defaultValue;
4544

4645
public DoubleListConfigField(ConfigFieldParameters params) throws ConfigException {
47-
super(params, Property.Type.DOUBLE);
46+
super(params,
47+
Property.Type.DOUBLE,
48+
Config.DefaultDoubleList.class,
49+
Config.DefaultDoubleList::value,
50+
Property::setDefaultValues
51+
);
4852
val range = Optional.ofNullable(field.getAnnotation(Config.RangeDouble.class));
4953
min = range.map(Config.RangeDouble::min).orElse(-Double.MAX_VALUE);
5054
max = range.map(Config.RangeDouble::max).orElse(Double.MAX_VALUE);
51-
defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultDoubleList.class))
52-
.map(Config.DefaultDoubleList::value)
53-
.orElseThrow(() -> noDefault(field, "DefaultDoubleList"));
54-
property.setDefaultValues(defaultValue);
5555
property.setMinValue(min);
5656
property.setMaxValue(max);
5757
try {

src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntListConfigField.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,20 +38,20 @@
3838
import java.util.Arrays;
3939
import java.util.Optional;
4040

41-
public class IntListConfigField extends AListConfigField<int[]> {
41+
public class IntListConfigField extends AListConfigField<int[], Config.DefaultIntList> {
4242
private final int min;
4343
private final int max;
44-
private final int[] defaultValue;
4544

4645
public IntListConfigField(ConfigFieldParameters params) throws ConfigException {
47-
super(params, Property.Type.INTEGER);
46+
super(params,
47+
Property.Type.INTEGER,
48+
Config.DefaultIntList.class,
49+
Config.DefaultIntList::value,
50+
Property::setDefaultValues
51+
);
4852
val range = Optional.ofNullable(field.getAnnotation(Config.RangeInt.class));
4953
min = range.map(Config.RangeInt::min).orElse(Integer.MIN_VALUE);
5054
max = range.map(Config.RangeInt::max).orElse(Integer.MAX_VALUE);
51-
defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultIntList.class))
52-
.map(Config.DefaultIntList::value)
53-
.orElseThrow(() -> noDefault(field, "DefaultIntList"));
54-
property.setDefaultValues(defaultValue);
5555
property.setMinValue(min);
5656
property.setMaxValue(max);
5757
if (!property.isIntList()) {

src/main/java/com/falsepattern/lib/internal/impl/config/fields/StringConfigField.java

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,22 +53,43 @@ public StringConfigField(ConfigFieldParameters params) {
5353
.orElseThrow(() -> noDefault(field, "DefaultString"));
5454
maxLength = Optional.ofNullable(field.getAnnotation(Config.StringMaxLength.class))
5555
.map(Config.StringMaxLength::value)
56-
.orElse(256);
56+
.orElse(-1);
5757
property.setDefaultValue(defaultValue);
58-
property.comment += "\n[max length: "
59-
+ maxLength
60-
+ (pattern != null ? ", pattern: \"" + pattern.pattern() + "\"" : "")
61-
+ ", default: \""
62-
+ defaultValue
63-
+ "\"]";
58+
property.comment += generateStringComment(maxLength, pattern, defaultValue);
59+
}
60+
61+
public static String generateStringComment(int maxStringLength, Pattern pattern, String defaultValue) {
62+
val cmt = new StringBuilder();
63+
boolean comma = false;
64+
if (maxStringLength >= 0) {
65+
cmt.append("\n[max string length: ").append(maxStringLength);
66+
comma = true;
67+
}
68+
if (pattern != null) {
69+
if (comma) {
70+
cmt.append(", ");
71+
} else {
72+
cmt.append("\n[");
73+
}
74+
cmt.append("pattern: \"").append(pattern.pattern()).append("\"");
75+
comma = true;
76+
}
77+
if (comma) {
78+
cmt.append(", ");
79+
} else {
80+
cmt.append("\n[");
81+
}
82+
cmt.append("default: ").append(defaultValue);
83+
cmt.append("]");
84+
return cmt.toString();
6485
}
6586

6687
public static boolean validateString(String value, int maxLength, Pattern pattern, Field field, int listIndex) {
6788
if (value == null) {
6889
ConfigValidationFailureEvent.fieldIsNull(field, listIndex);
6990
return false;
7091
}
71-
if (value.length() > maxLength) {
92+
if (maxLength >= 0 && value.length() > maxLength) {
7293
ConfigValidationFailureEvent.postStringSizeOutOfBounds(field, listIndex, value, maxLength);
7394
return false;
7495
}
@@ -87,7 +108,7 @@ public static void transmitString(DataOutput output, String value) throws IOExce
87108
public static String receiveString(DataInput input, int maxLength, String valueName, String className)
88109
throws IOException {
89110
val length = input.readInt();
90-
if (length > maxLength || length < 0) {
111+
if ((maxLength >= 0 && length > maxLength) || length < 0) {
91112
throw new IOException("Error while retrieving value for "
92113
+ valueName
93114
+ " in class "

src/main/java/com/falsepattern/lib/internal/impl/config/fields/StringListConfigField.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,33 +38,27 @@
3838
import java.util.Optional;
3939
import java.util.regex.Pattern;
4040

41-
public class StringListConfigField extends AListConfigField<String[]> {
42-
private final String[] defaultValue;
41+
public class StringListConfigField extends AListConfigField<String[], Config.DefaultStringList> {
4342
private final Pattern pattern;
4443
private final int maxStringLength;
4544

4645
public StringListConfigField(ConfigFieldParameters params) throws ConfigException {
47-
super(params, Property.Type.STRING);
46+
super(params,
47+
Property.Type.STRING,
48+
Config.DefaultStringList.class,
49+
Config.DefaultStringList::value,
50+
Property::setDefaultValues
51+
);
4852
pattern = Optional.ofNullable(field.getAnnotation(Config.Pattern.class))
4953
.map((ptr) -> Pattern.compile(ptr.value()))
5054
.orElse(null);
51-
defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultStringList.class))
52-
.map(Config.DefaultStringList::value)
53-
.orElseThrow(() -> noDefault(field, "DefaultStringList"));
5455
maxStringLength = Optional.ofNullable(field.getAnnotation(Config.StringMaxLength.class))
5556
.map(Config.StringMaxLength::value)
56-
.orElse(256);
57-
property.setDefaultValues(defaultValue);
57+
.orElse(-1);
5858
if (!property.isList()) {
5959
setToDefault();
6060
}
61-
property.comment +=
62-
"\n[max string length: "
63-
+ maxLength
64-
+ (pattern != null ? ", pattern: \"" + pattern.pattern() + "\"" : "")
65-
+ ", default: \""
66-
+ stringify(defaultValue)
67-
+ "\"]";
61+
property.comment += StringConfigField.generateStringComment(maxStringLength, pattern, stringify(defaultValue));
6862
}
6963

7064
private static String stringify(String[] arr) {

0 commit comments

Comments
 (0)