summaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea/pcj/json/JsonCodec.java
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-14 01:35:24 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-14 01:35:24 +0100
commited8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3 (patch)
tree9f8418ce1f27634a5a5f37a07f57c45379584d87 /src/main/java/moe/nea/pcj/json/JsonCodec.java
parent94e30f7ffbafcdd188d09d8c7bf7e4794b650018 (diff)
downloadprofunctor-codecs-java-ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3.tar.gz
profunctor-codecs-java-ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3.tar.bz2
profunctor-codecs-java-ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3.zip
wip
Diffstat (limited to 'src/main/java/moe/nea/pcj/json/JsonCodec.java')
-rw-r--r--src/main/java/moe/nea/pcj/json/JsonCodec.java31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/pcj/json/JsonCodec.java b/src/main/java/moe/nea/pcj/json/JsonCodec.java
new file mode 100644
index 0000000..65f4a5e
--- /dev/null
+++ b/src/main/java/moe/nea/pcj/json/JsonCodec.java
@@ -0,0 +1,31 @@
+package moe.nea.pcj.json;
+
+import moe.nea.pcj.Codec;
+import moe.nea.pcj.Result;
+
+public interface JsonCodec<T, Format> extends Codec<
+ T, Format, JsonLikeOperations<Format>,
+ JsonLikeError, JsonLikeError> {
+
+ default MapCodec<T, Format> fieldOf(String key) {
+ return new MapCodec<>() {
+ @Override
+ public Result<T, JsonLikeError> decode(RecordView<Format> record, JsonLikeOperations<Format> ops) {
+ return record.get(key)
+ .map(element -> Result.<T, JsonLikeError>cast(
+ JsonCodec.this.decode(element, ops)
+ .mapError(it -> new AtField(key, it))))
+ .orElseGet(() -> Result.fail(new MissingKey(key)));
+ }
+
+ @Override
+ public Result<RecordBuilder<Format>, JsonLikeError> encode(T value, JsonLikeOperations<Format> ops) {
+ var record = ops.createObject();
+ return Result.<Format, JsonLikeError>cast(JsonCodec.this.encode(value, ops))
+ .<JsonLikeError>mapError(it -> new AtField(key, it))
+ .flatMap(json -> Result.cast(record.add(key, json).map(unit -> record)));
+ }
+
+ };
+ }
+}