summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-14 03:02:05 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-14 03:02:05 +0100
commit4289518c93cf8bf04f88125ef3deea3af8978607 (patch)
tree288f757a4a276a45a136900577ec5efeb2742063
parent5eea18ea497d4bc11466b2bd875582ba26f188f5 (diff)
downloadprofunctor-codecs-java-4289518c93cf8bf04f88125ef3deea3af8978607.tar.gz
profunctor-codecs-java-4289518c93cf8bf04f88125ef3deea3af8978607.tar.bz2
profunctor-codecs-java-4289518c93cf8bf04f88125ef3deea3af8978607.zip
Add named objects
-rw-r--r--gson/src/test/java/moe/nea/jcp/gson/test/TestBasic.java7
-rw-r--r--src/main/java/moe/nea/pcj/json/JsonCodec.java15
-rw-r--r--src/main/java/moe/nea/pcj/json/NamedObject.java4
3 files changed, 25 insertions, 1 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 861656e..70c4345 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
@@ -16,6 +16,7 @@ import moe.nea.pcj.json.DuplicateJsonKey;
import moe.nea.pcj.json.JsonLikeError;
import moe.nea.pcj.json.JsonLikeOperations;
import moe.nea.pcj.json.MissingKey;
+import moe.nea.pcj.json.NamedObject;
import moe.nea.pcj.json.RecordJoiners;
import moe.nea.pcj.json.UnexpectedJsonElement;
import org.junit.jupiter.api.Assertions;
@@ -97,6 +98,12 @@ public class TestBasic {
@Test
+ void testNamedFunction() {
+ assertFail(decode(codecs.STRING.named("Test"), mkPrim(0)),
+ new NamedObject("Test", new UnexpectedJsonElement("string", mkPrim(0))));
+ }
+
+ @Test
void testObject() {
var codec = RecordJoiners.join(
codecs.STRING.fieldOf("foo").withGetter(TestObject::foo),
diff --git a/src/main/java/moe/nea/pcj/json/JsonCodec.java b/src/main/java/moe/nea/pcj/json/JsonCodec.java
index 6195bee..c5c750b 100644
--- a/src/main/java/moe/nea/pcj/json/JsonCodec.java
+++ b/src/main/java/moe/nea/pcj/json/JsonCodec.java
@@ -2,7 +2,6 @@ package moe.nea.pcj.json;
import moe.nea.pcj.Codec;
import moe.nea.pcj.Result;
-import moe.nea.pcj.Unit;
import java.util.ArrayList;
import java.util.List;
@@ -47,6 +46,20 @@ public interface JsonCodec<T, Format> extends Codec<
};
}
+ default JsonCodec<T, Format> named(String name) {
+ return new JsonCodec<>() {
+ @Override
+ public Result<? extends T, JsonLikeError> decode(Format format, JsonLikeOperations<Format> ops) {
+ return JsonCodec.this.decode(format, ops).mapError(it -> new NamedObject(name, it));
+ }
+
+ @Override
+ public Result<? extends Format, JsonLikeError> encode(T data, JsonLikeOperations<Format> ops) {
+ return JsonCodec.this.encode(data, ops).mapError(it -> new NamedObject(name, it));
+ }
+ };
+ }
+
default MapCodec<T, Format> fieldOf(String key) {
return new MapCodec<>() {
@Override
diff --git a/src/main/java/moe/nea/pcj/json/NamedObject.java b/src/main/java/moe/nea/pcj/json/NamedObject.java
new file mode 100644
index 0000000..aedc87b
--- /dev/null
+++ b/src/main/java/moe/nea/pcj/json/NamedObject.java
@@ -0,0 +1,4 @@
+package moe.nea.pcj.json;
+
+public record NamedObject(String name, JsonLikeError error) implements JsonLikeError {
+}