Skip to content

Commit 3309e41

Browse files
committed
Leniently support pack.mcmeta versions formatted as doubles or dot-separated strings
1 parent 78428b1 commit 3309e41

1 file changed

Lines changed: 30 additions & 6 deletions

File tree

core/src/main/java/de/bluecolored/bluemap/core/resources/pack/PackVersion.java

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import lombok.ToString;
3535

3636
import java.io.IOException;
37+
import java.util.regex.Matcher;
38+
import java.util.regex.Pattern;
3739

3840
@AllArgsConstructor
3941
@Getter
@@ -54,6 +56,8 @@ public boolean isSmallerOrEqual(PackVersion other) {
5456

5557
public static class Adapter extends TypeAdapter<PackVersion> {
5658

59+
private static final Pattern VERSION_STRING_PATTERN = Pattern.compile("^(\\d+)(?:\\.(\\d+))?$");
60+
5761
private final int defaultMinor;
5862

5963
public Adapter(int defaultMinor) {
@@ -67,12 +71,32 @@ public void write(JsonWriter out, PackVersion value) {
6771

6872
@Override
6973
public PackVersion read(JsonReader in) throws IOException {
70-
if (in.peek() == JsonToken.NUMBER) return new PackVersion(in.nextInt(), defaultMinor);
71-
in.beginArray();
72-
int major = in.nextInt();
73-
int minor = in.hasNext() ? in.nextInt() : defaultMinor;
74-
in.endArray();
75-
return new PackVersion(major, minor);
74+
return switch (in.peek()) {
75+
case JsonToken.STRING -> parseString(in.nextString());
76+
case NUMBER -> {
77+
double version = in.nextDouble();
78+
if (version == Math.floor(version)) yield new PackVersion((int) version, defaultMinor);
79+
yield parseString("%.9f".formatted(version));
80+
}
81+
case BEGIN_ARRAY -> {
82+
in.beginArray();
83+
int major = in.nextInt();
84+
int minor = in.hasNext() ? in.nextInt() : defaultMinor;
85+
in.endArray();
86+
yield new PackVersion(major, minor);
87+
}
88+
default -> throw new IOException("Invalid version format: '%s'!".formatted(in.peek()));
89+
};
90+
}
91+
92+
private PackVersion parseString(String versionString) throws IOException {
93+
Matcher versionStringMatcher = VERSION_STRING_PATTERN.matcher(versionString);
94+
if (!versionStringMatcher.matches())
95+
throw new IOException("Invalid version string: '%s'!".formatted(versionString));
96+
97+
String major = versionStringMatcher.group(1);
98+
String minor = versionStringMatcher.group(2);
99+
return new PackVersion(Integer.parseInt(major), minor != null && !minor.isEmpty() ? Integer.parseInt(minor) : defaultMinor);
76100
}
77101

78102
}

0 commit comments

Comments
 (0)