diff --git a/gradle.properties b/gradle.properties index e0260e29..e4d18a59 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -majorMinor: 7.0 +majorMinor: 7.1 diff --git a/src/main/java/com/mojang/serialization/DataResult.java b/src/main/java/com/mojang/serialization/DataResult.java index b2531817..e5870e16 100644 --- a/src/main/java/com/mojang/serialization/DataResult.java +++ b/src/main/java/com/mojang/serialization/DataResult.java @@ -67,6 +67,8 @@ static String appendMessages(final String first, final String second) { Lifecycle lifecycle(); + boolean hasResultOrPartial(); + Optional resultOrPartial(Consumer onError); Optional resultOrPartial(); @@ -143,6 +145,11 @@ public Optional> error() { return Optional.empty(); } + @Override + public boolean hasResultOrPartial() { + return true; + } + @Override public Optional resultOrPartial(final Consumer onError) { return Optional.of(value); @@ -259,6 +266,11 @@ public Optional> error() { return Optional.of(this); } + @Override + public boolean hasResultOrPartial() { + return partialValue.isPresent(); + } + @Override public Optional resultOrPartial(final Consumer onError) { onError.accept(messageSupplier.get()); diff --git a/src/main/java/com/mojang/serialization/KeyCompressor.java b/src/main/java/com/mojang/serialization/KeyCompressor.java index 76422852..c3436982 100644 --- a/src/main/java/com/mojang/serialization/KeyCompressor.java +++ b/src/main/java/com/mojang/serialization/KeyCompressor.java @@ -46,7 +46,7 @@ public int compress(final String key) { } public int compress(final T key) { - return compress.get(key); + return compress.getInt(key); } public int size() { diff --git a/src/main/java/com/mojang/serialization/codecs/EitherCodec.java b/src/main/java/com/mojang/serialization/codecs/EitherCodec.java index 1ad0b6b2..36ab0783 100644 --- a/src/main/java/com/mojang/serialization/codecs/EitherCodec.java +++ b/src/main/java/com/mojang/serialization/codecs/EitherCodec.java @@ -19,7 +19,13 @@ public DataResult, T>> decode(final DynamicOps ops, fin if (secondRead.isSuccess()) { return secondRead; } - return firstRead.apply2((f, s) -> s, secondRead); + if (firstRead.hasResultOrPartial()) { + return firstRead; + } + if (secondRead.hasResultOrPartial()) { + return secondRead; + } + return DataResult.error(() -> "Failed to parse either. First: " + firstRead.error().orElseThrow().message() + "; Second: " + secondRead.error().orElseThrow().message()); } @Override diff --git a/src/test/java/com/mojang/serialization/CodecTests.java b/src/test/java/com/mojang/serialization/CodecTests.java index 15ac630d..48c85e48 100644 --- a/src/test/java/com/mojang/serialization/CodecTests.java +++ b/src/test/java/com/mojang/serialization/CodecTests.java @@ -32,6 +32,10 @@ private static T fromJavaOrPartial(final Codec codec, final Object value) return codec.parse(JavaOps.INSTANCE, value).getPartialOrThrow(AssertionError::new); } + private static String fromJavaErrorMessage(final Codec codec, final Object value) { + return codec.parse(JavaOps.INSTANCE, value).error().orElseThrow(AssertionError::new).message(); + } + private static void assertFromJavaFails(final Codec codec, final Object value) { final DataResult result = codec.parse(JavaOps.INSTANCE, value); assertTrue("Expected data result error, but got: " + result.result(), result.isError()); @@ -249,6 +253,69 @@ public void withAlternative_simple() { assertFromJavaFails(codec, false); } + public static final Codec NEVER_PRIMARY = Codec.STRING.validate(s -> DataResult.error(() -> "Failed Primary")); + public static final Codec NEVER_ALTERNATIVE = Codec.STRING.validate(s -> DataResult.error(() -> "Failed Alternative")); + public static final Codec NEVER_WITH_PARTIAL_PRIMARY = Codec.STRING.validate(s -> DataResult.error(() -> "Failed Primary with partial", "Partial Primary: " + s)); + public static final Codec NEVER_WITH_PARTIAL_ALTERNATIVE = Codec.STRING.validate(s -> DataResult.error(() -> "Failed Alternative with partial", "Partial Alternative: " + s)); + + @Test + public void withAlternative_primaryPartialAlternativeFails() { + final Codec codec = Codec.withAlternative( + NEVER_WITH_PARTIAL_PRIMARY, + NEVER_ALTERNATIVE + ); + assertEquals( + "Partial Primary: value", + fromJavaOrPartial(codec, "value") + ); + + assertEquals( + "Failed Primary with partial", + fromJavaErrorMessage(codec, "value") + ); + } + + @Test + public void withAlternative_primaryFailsAlternativePartial() { + final Codec codec = Codec.withAlternative( + NEVER_PRIMARY, + NEVER_WITH_PARTIAL_ALTERNATIVE + ); + assertEquals( + "Partial Alternative: value", + fromJavaOrPartial(codec, "value") + ); + + assertEquals( + "Failed Alternative with partial", + fromJavaErrorMessage(codec, "value") + ); + } + + @Test + public void withAlternative_bothPartialPrefersPrimary() { + final Codec codec = Codec.withAlternative( + NEVER_WITH_PARTIAL_PRIMARY, + NEVER_WITH_PARTIAL_ALTERNATIVE + ); + assertEquals( + "Partial Primary: value", + fromJavaOrPartial(codec, "value") + ); + } + + @Test + public void withAlternative_bothFail() { + final Codec codec = Codec.withAlternative( + NEVER_PRIMARY, + NEVER_ALTERNATIVE + ); + assertEquals( + "Failed to parse either. First: Failed Primary; Second: Failed Alternative", + fromJavaErrorMessage(codec, "value") + ); + } + @Test public void withAlternative_bothSuccessful() { final Codec codec = Codec.withAlternative(Codec.STRING, TO_LOWER_CASE);