Skip to content

Commit 68beda4

Browse files
committed
Improve the list codec error messages
1 parent b3dee2d commit 68beda4

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package net.errorcraft.codecium.mixin.mojang.serialization.codecs;
2+
3+
import com.llamalad7.mixinextras.injector.ModifyReturnValue;
4+
import com.llamalad7.mixinextras.sugar.Local;
5+
import com.mojang.datafixers.util.Pair;
6+
import com.mojang.serialization.DataResult;
7+
import com.mojang.serialization.codecs.ListCodec;
8+
import net.errorcraft.codecium.util.EnglishUtil;
9+
import org.spongepowered.asm.mixin.Final;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.Shadow;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.ModifyArg;
14+
15+
import java.util.List;
16+
import java.util.function.Supplier;
17+
18+
@Mixin(value = ListCodec.class, remap = false)
19+
public class ListCodecExtender<E> {
20+
@Shadow
21+
@Final
22+
private int minSize;
23+
24+
@Shadow
25+
@Final
26+
private int maxSize;
27+
28+
@ModifyArg(
29+
method = "createTooShortError",
30+
at = @At(
31+
value = "INVOKE",
32+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;"
33+
)
34+
)
35+
private Supplier<String> tooShortUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) final int size) {
36+
return () -> "List must have at least " + this.minSize + " " + EnglishUtil.pluralize(this.minSize, "value") + ", but got " + size;
37+
}
38+
39+
@ModifyArg(
40+
method = "createTooLongError",
41+
at = @At(
42+
value = "INVOKE",
43+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;"
44+
)
45+
)
46+
private Supplier<String> tooLongUseBetterErrorMessage(Supplier<String> message, @Local(argsOnly = true) final int size) {
47+
return () -> "List must have at most " + this.maxSize + " " + EnglishUtil.pluralize(this.maxSize, "value") + ", but got " + size;
48+
}
49+
50+
@ModifyReturnValue(
51+
method = "decode",
52+
at = @At("TAIL")
53+
)
54+
private <T> DataResult<Pair<List<E>, T>> listErrorAddListToErrorMessage(DataResult<Pair<List<E>, T>> original, @Local(argsOnly = true) final T input) {
55+
return original.mapError(message -> message + ": " + input);
56+
}
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package net.errorcraft.codecium.util;
2+
3+
public class EnglishUtil {
4+
private EnglishUtil() {}
5+
6+
public static String pluralize(int amount, String singular) {
7+
return pluralize(amount, singular, singular + "s");
8+
}
9+
10+
public static String pluralize(int amount, String singular, String plural) {
11+
return amount == 1 ? singular : plural;
12+
}
13+
}

src/main/resources/codecium.mixins.json

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"mojang.serialization.codecs.BaseMapCodecExtender",
1717
"mojang.serialization.codecs.EitherCodecExtender",
1818
"mojang.serialization.codecs.FieldDecoderExtender",
19+
"mojang.serialization.codecs.ListCodecExtender",
1920
"mojang.serialization.codecs.OptionalFieldCodecExtender",
2021
"mojang.serialization.codecs.RecordCodecBuilderExtender$RecordMapCodecExtender"
2122
],

0 commit comments

Comments
 (0)