diff options
author | Linnea Gräf <nea@nea.moe> | 2024-11-14 01:35:24 +0100 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-11-14 01:35:24 +0100 |
commit | ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3 (patch) | |
tree | 9f8418ce1f27634a5a5f37a07f57c45379584d87 /src/main/java/moe/nea/pcj/json/JsonCodec.java | |
parent | 94e30f7ffbafcdd188d09d8c7bf7e4794b650018 (diff) | |
download | profunctor-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.java | 31 |
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))); + } + + }; + } +} |