Skip to content

Commit e7ce448

Browse files
committed
Improve the xor codec error messages
1 parent 2805b8a commit e7ce448

File tree

4 files changed

+61
-13
lines changed

4 files changed

+61
-13
lines changed

src/main/java/net/errorcraft/codecium/mixin/mojang/serialization/codecs/EitherCodecExtender.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.spongepowered.asm.mixin.injection.At;
1111
import org.spongepowered.asm.mixin.injection.ModifyArg;
1212

13-
import java.util.Objects;
1413
import java.util.function.Supplier;
1514

1615
@Mixin(value = EitherCodec.class, remap = false)
@@ -23,16 +22,6 @@ public class EitherCodecExtender<F, S> {
2322
)
2423
)
2524
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) {
26-
return () -> {
27-
String first = firstRead.error().orElseThrow().message();
28-
String second = secondRead.error().orElseThrow().message();
29-
if (Objects.equals(first, second)) {
30-
return first;
31-
}
32-
return "Failed to decode either:\n" + StringUtil.indent(
33-
"1: " + first + "\n" +
34-
"2: " + second
35-
);
36-
};
25+
return StringUtil.supplyEitherErrorMessage(firstRead, secondRead);
3726
}
3827
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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.Either;
6+
import com.mojang.datafixers.util.Pair;
7+
import com.mojang.serialization.DataResult;
8+
import com.mojang.serialization.codecs.XorCodec;
9+
import net.errorcraft.codecium.util.StringUtil;
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.injection.At;
12+
import org.spongepowered.asm.mixin.injection.ModifyArg;
13+
14+
import java.util.Optional;
15+
import java.util.function.Supplier;
16+
17+
@Mixin(value = XorCodec.class, remap = false)
18+
public class XorCodecExtender<F, S> {
19+
@ModifyArg(
20+
method = "decode",
21+
at = @At(
22+
value = "INVOKE",
23+
target = "Lcom/mojang/serialization/DataResult;error(Ljava/util/function/Supplier;Ljava/lang/Object;)Lcom/mojang/serialization/DataResult;"
24+
)
25+
)
26+
@SuppressWarnings({ "OptionalUsedAsFieldOrParameterType", "OptionalGetWithoutIsPresent" })
27+
private <T> Supplier<String> useBetterErrorMessage(Supplier<String> message, @Local(name = "firstResult") final Optional<Pair<Either<F, S>, T>> firstResult, @Local(name = "secondResult") final Optional<Pair<Either<F, S>, T>> secondResult) {
28+
return () -> "Decoded both alternatives successfully, cannot pick the correct one:\n" + StringUtil.indent(
29+
"1: " + firstResult.get() + "\n" +
30+
"2: " + secondResult.get()
31+
);
32+
}
33+
34+
@ModifyReturnValue(
35+
method = "decode",
36+
at = @At("TAIL")
37+
)
38+
private <T> DataResult<Pair<Either<F, S>, T>> useBetterErrorMessage(DataResult<Pair<Either<F, S>, T>> original, @Local(name = "firstRead") final DataResult<Pair<Either<F, S>, T>> firstRead, @Local(name = "secondRead") final DataResult<Pair<Either<F, S>, T>> secondRead) {
39+
return DataResult.error(StringUtil.supplyEitherErrorMessage(firstRead, secondRead));
40+
}
41+
}

src/main/java/net/errorcraft/codecium/util/StringUtil.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package net.errorcraft.codecium.util;
22

3+
import com.mojang.serialization.DataResult;
4+
35
import java.util.Objects;
6+
import java.util.function.Supplier;
47
import java.util.stream.Stream;
58

69
public class StringUtil {
@@ -31,4 +34,18 @@ private static String indent(Stream<String> lines, String indentation) {
3134
builder.setLength(builder.length() - 1);
3235
return builder.toString();
3336
}
37+
38+
public static <T> Supplier<String> supplyEitherErrorMessage(final DataResult<T> first, final DataResult<T> second) {
39+
return () -> {
40+
String firstMessage = first.error().orElseThrow().message();
41+
String secondMessage = second.error().orElseThrow().message();
42+
if (Objects.equals(firstMessage, secondMessage)) {
43+
return firstMessage;
44+
}
45+
return "Failed to decode either:\n" + indent(
46+
"1: " + firstMessage + "\n" +
47+
"2: " + secondMessage
48+
);
49+
};
50+
}
3451
}

src/main/resources/codecium.mixins.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
"mojang.serialization.codecs.KeyDispatchCodecExtender",
2020
"mojang.serialization.codecs.ListCodecExtender",
2121
"mojang.serialization.codecs.OptionalFieldCodecExtender",
22-
"mojang.serialization.codecs.RecordCodecBuilderExtender$RecordMapCodecExtender"
22+
"mojang.serialization.codecs.RecordCodecBuilderExtender$RecordMapCodecExtender",
23+
"mojang.serialization.codecs.XorCodecExtender"
2324
],
2425
"injectors": {
2526
"defaultRequire": 1

0 commit comments

Comments
 (0)