diff options
-rw-r--r-- | gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java | 7 | ||||
-rw-r--r-- | src/main/java/moe/nea/pcj/Result.java | 30 |
2 files changed, 35 insertions, 2 deletions
diff --git a/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java b/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java index c0e42b6..c525303 100644 --- a/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java +++ b/gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java @@ -6,6 +6,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import moe.nea.jcp.gson.GsonCodecs; import moe.nea.jcp.gson.GsonOperations; +import moe.nea.pcj.Codec; import moe.nea.pcj.Decode; import moe.nea.pcj.Result; import moe.nea.pcj.json.JsonLikeError; @@ -37,8 +38,10 @@ public class TestBasic { Assertions.assertEquals(expected, result.valueOrPartial().get()); } - <T> Result<T, JsonLikeError> decode(Decode<T, JsonElement, JsonLikeOperations<JsonElement>, JsonLikeError> decode, JsonElement element) { - return Result.cast(decode.decode(element, GsonOperations.INSTANCE)); + <T> Result<T, JsonLikeError> decode(Codec<T, JsonElement, JsonLikeOperations<JsonElement>, JsonLikeError, JsonLikeError> decode, JsonElement element) { + Result<T, JsonLikeError> result = Result.cast(decode.decode(element, GsonOperations.INSTANCE)); + result.value().ifPresent(decoded -> Assertions.assertEquals(Result.ok(element), decode.encode(decoded, GsonOperations.INSTANCE))); + return result; } GsonCodecs codecs = GsonCodecs.INSTANCE; diff --git a/src/main/java/moe/nea/pcj/Result.java b/src/main/java/moe/nea/pcj/Result.java index e43633b..22c94f9 100644 --- a/src/main/java/moe/nea/pcj/Result.java +++ b/src/main/java/moe/nea/pcj/Result.java @@ -5,6 +5,7 @@ import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.function.Function; @@ -40,6 +41,7 @@ public sealed interface Result<Good, Bad> permits Result.Ok, Result.Fail { record Ok<Good, Bad>(Good okValue) implements Result<Good, Bad> { @Override public Result<Good, Bad> appendErrors(List<Bad> errors) { + if (errors.isEmpty()) return new Ok<>(okValue); return new Fail<>(okValue, errors); } @@ -67,6 +69,20 @@ public sealed interface Result<Good, Bad> permits Result.Ok, Result.Fail { public Optional<Good> value() { return Optional.of(okValue); } + + @Override + public int hashCode() { + return Objects.hash(okValue); + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj instanceof Result.Ok<?, ?> ok) { + return Objects.equals(ok.okValue, this.okValue); + } + return false; + } } record Fail<Good, Bad>(@Nullable Good partialValue, List<Bad> badValue) implements Result<Good, Bad> { @@ -76,6 +92,20 @@ public sealed interface Result<Good, Bad> permits Result.Ok, Result.Fail { } @Override + public boolean equals(Object obj) { + if (this == obj) return true; + if (obj instanceof Result.Fail<?, ?> fail) { + return Objects.equals(partialValue, fail.partialValue) && badValue.equals(fail.badValue); + } + return false; + } + + @Override + public int hashCode() { + return Objects.hash(partialValue, badValue); + } + + @Override public Optional<Good> value() { return Optional.empty(); } |