From 5eea18ea497d4bc11466b2bd875582ba26f188f5 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Thu, 14 Nov 2024 02:59:11 +0100 Subject: Add lists --- src/main/java/moe/nea/pcj/json/JsonCodec.java | 40 +++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'src/main/java/moe/nea/pcj/json/JsonCodec.java') diff --git a/src/main/java/moe/nea/pcj/json/JsonCodec.java b/src/main/java/moe/nea/pcj/json/JsonCodec.java index 65f4a5e..6195bee 100644 --- a/src/main/java/moe/nea/pcj/json/JsonCodec.java +++ b/src/main/java/moe/nea/pcj/json/JsonCodec.java @@ -2,11 +2,51 @@ 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; public interface JsonCodec extends Codec< T, Format, JsonLikeOperations, JsonLikeError, JsonLikeError> { + default JsonCodec, Format> listOf() { + return new JsonCodec<>() { + @Override + public Result encode(List data, JsonLikeOperations ops) { + var list = ops.createList(); + var erros = new ArrayList(); + for (int i = 0; i < data.size(); i++) { + var datum = data.get(i); + final var index = i; + var result = JsonCodec.this.encode(datum, ops) + .mapError(it -> new AtIndex(index, it)); + erros.addAll(result.errors()); + result.valueOrPartial().ifPresent(list::add); + } + return Result.ok(list.complete()).appendErrors(erros); + } + + @Override + public Result, JsonLikeError> decode(Format format, JsonLikeOperations ops) { + var view = Result., JsonLikeError>cast(ops.getList(format)); + return view.flatMap(elements -> { + var acc = new ArrayList(elements.length()); + var errors = new ArrayList(); + for (int i = 0; i < elements.length(); i++) { + final var index = i; + var result = JsonCodec.this.decode(elements.getUnsafe(i), ops) + .mapError(it -> new AtIndex(index, it)); + errors.addAll(result.errors()); + result.valueOrPartial().ifPresent(acc::add); + } + return Result., JsonLikeError>ok(acc).appendErrors(errors); + }); + } + }; + } + default MapCodec fieldOf(String key) { return new MapCodec<>() { @Override -- cgit