summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java7
-rw-r--r--src/main/java/moe/nea/pcj/Result.java30
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();
}