Skip to content

Commit 57e381d

Browse files
committed
Improve the either codec error message
1 parent 3e82486 commit 57e381d

3 files changed

Lines changed: 66 additions & 1 deletion

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package net.errorcraft.codecium.mixin.mojang.serialization.codecs;
2+
3+
import com.llamalad7.mixinextras.sugar.Local;
4+
import com.mojang.datafixers.util.Either;
5+
import com.mojang.datafixers.util.Pair;
6+
import com.mojang.serialization.DataResult;
7+
import com.mojang.serialization.codecs.EitherCodec;
8+
import net.errorcraft.codecium.util.StringUtil;
9+
import org.spongepowered.asm.mixin.Mixin;
10+
import org.spongepowered.asm.mixin.injection.At;
11+
import org.spongepowered.asm.mixin.injection.ModifyArg;
12+
13+
import java.util.function.Supplier;
14+
15+
@Mixin(value = EitherCodec.class, remap = false)
16+
public class EitherCodecExtender<F, S> {
17+
@ModifyArg(
18+
method = "decode",
19+
at = @At(
20+
value = "INVOKE",
21+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;)Lcom/mojang/serialization/DataResult;"
22+
)
23+
)
24+
private <T> Supplier<String> useBetterErrorMessage(Supplier<String> message, @Local(name = "firstRead") final DataResult<Pair<Either<F, S>, T>> firstRead, @Local(name = "secondRead") final DataResult<Pair<Either<F, S>, T>> secondRead) {
25+
return () -> "Failed to decode either:\n" + StringUtil.indent(
26+
"1: " + firstRead.error().orElseThrow().message() + "\n" +
27+
"2: " + secondRead.error().orElseThrow().message()
28+
);
29+
}
30+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package net.errorcraft.codecium.util;
2+
3+
import java.util.Objects;
4+
import java.util.stream.Stream;
5+
6+
public class StringUtil {
7+
private static final String DEFAULT_INDENTATION = " ";
8+
9+
private StringUtil() {}
10+
11+
public static String indent(String value) {
12+
return indent(value, DEFAULT_INDENTATION);
13+
}
14+
15+
public static String indent(String value, String indentation) {
16+
return indent(value.lines(), indentation);
17+
}
18+
19+
private static String indent(Stream<String> lines, String indentation) {
20+
Objects.requireNonNull(lines);
21+
Objects.requireNonNull(indentation);
22+
StringBuilder builder = new StringBuilder();
23+
lines.forEach(line -> {
24+
builder.append(indentation);
25+
builder.append(line);
26+
builder.append('\n');
27+
});
28+
if (builder.isEmpty()) {
29+
return "";
30+
}
31+
builder.setLength(builder.length() - 1);
32+
return builder.toString();
33+
}
34+
}

src/main/resources/codecium.mixins.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"package": "net.errorcraft.codecium.mixin",
44
"compatibilityLevel": "JAVA_21",
55
"mixins": [
6-
"mojang.serialization.CodecExtender"
6+
"mojang.serialization.CodecExtender",
7+
"mojang.serialization.codecs.EitherCodecExtender"
78
],
89
"injectors": {
910
"defaultRequire": 1

0 commit comments

Comments
 (0)