diff options
author | Linnea Gräf <nea@nea.moe> | 2024-11-14 21:50:10 +0100 |
---|---|---|
committer | Linnea Gräf <nea@nea.moe> | 2024-11-14 21:50:10 +0100 |
commit | 63cb7a0e19e7afd06637dddb848d0254cbff5795 (patch) | |
tree | 81ce70514027a88456ae8635c65954afabbdfcee /src/main | |
parent | 742a354000241d25406ffbe9a38f9eb2e6d0e128 (diff) | |
download | profunctor-codecs-java-63cb7a0e19e7afd06637dddb848d0254cbff5795.tar.gz profunctor-codecs-java-63cb7a0e19e7afd06637dddb848d0254cbff5795.tar.bz2 profunctor-codecs-java-63cb7a0e19e7afd06637dddb848d0254cbff5795.zip |
Better errors for dispatch codecs
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/moe/nea/pcj/json/DuringKeyExtraction.java | 4 | ||||
-rw-r--r-- | src/main/java/moe/nea/pcj/json/InSubType.java | 4 | ||||
-rw-r--r-- | src/main/java/moe/nea/pcj/json/MapCodec.java | 24 | ||||
-rw-r--r-- | src/main/java/moe/nea/pcj/json/UnknownSubtype.java | 10 |
4 files changed, 34 insertions, 8 deletions
diff --git a/src/main/java/moe/nea/pcj/json/DuringKeyExtraction.java b/src/main/java/moe/nea/pcj/json/DuringKeyExtraction.java new file mode 100644 index 0000000..859f98f --- /dev/null +++ b/src/main/java/moe/nea/pcj/json/DuringKeyExtraction.java @@ -0,0 +1,4 @@ +package moe.nea.pcj.json; + +public record DuringKeyExtraction(JsonLikeError error) implements JsonLikeError { +} diff --git a/src/main/java/moe/nea/pcj/json/InSubType.java b/src/main/java/moe/nea/pcj/json/InSubType.java new file mode 100644 index 0000000..ae62a73 --- /dev/null +++ b/src/main/java/moe/nea/pcj/json/InSubType.java @@ -0,0 +1,4 @@ +package moe.nea.pcj.json; + +public record InSubType<T>(T typeTag, JsonLikeError error) implements JsonLikeError { +} diff --git a/src/main/java/moe/nea/pcj/json/MapCodec.java b/src/main/java/moe/nea/pcj/json/MapCodec.java index b18a639..9f343fd 100644 --- a/src/main/java/moe/nea/pcj/json/MapCodec.java +++ b/src/main/java/moe/nea/pcj/json/MapCodec.java @@ -13,24 +13,32 @@ public interface MapCodec<T, Format> { default <O> MapCodec<? extends O, Format> dispatch( Function<? super O, ? extends T> keyExtractor, - Function<? super T, MapCodec<? extends O, Format>> codecGenerator + Function<? super T, Result<? extends MapCodec<? extends O, Format>, ? extends JsonLikeError>> codecGenerator ) { // TODO: the codecGenerator function is not exactly typesafe. there should be some limit on keyExtractor and codecGenerator working in tandem return new MapCodec<>() { @Override - public Result<O, JsonLikeError> decode(RecordView<Format> record, JsonLikeOperations<Format> ops) { + public Result<O, JsonLikeError> decode(RecordView<Format> record, JsonLikeOperations<Format> ops) { // TODO: map errors return MapCodec.this.decode(record, ops) - .map(codecGenerator::apply) - .flatMap(codec -> codec.decode(record, ops)); + .flatMap(key -> codecGenerator + .apply(key) + .<JsonLikeError>mapError(DuringKeyExtraction::new) + .flatMap(codec -> codec.decode(record, ops) + .<JsonLikeError>mapError(it -> new InSubType<>(key, it)))); } @Override public Result<RecordBuilder<Format>, JsonLikeError> encode(O value, JsonLikeOperations<Format> ops) { var key = keyExtractor.apply(value); - var codec = codecGenerator.apply(key); - return MapCodec.this - .encode(key, ops) - .flatMap(keyEncoded -> ((MapCodec<O, Format>) codec).encode(value, ops).flatMap(keyEncoded::mergeWith)); + return Result.<MapCodec<? extends O, Format>, JsonLikeError>cast( + codecGenerator.apply(key) + .mapError(DuringKeyExtraction::new)) + .flatMap(codec -> MapCodec.this + .encode(key, ops) + .flatMap(keyEncoded -> ((MapCodec<O, Format>) codec) + .encode(value, ops) + .<JsonLikeError>mapError(it -> new InSubType<>(key, it)) + .flatMap(keyEncoded::mergeWith))); } }; } diff --git a/src/main/java/moe/nea/pcj/json/UnknownSubtype.java b/src/main/java/moe/nea/pcj/json/UnknownSubtype.java new file mode 100644 index 0000000..942a7dc --- /dev/null +++ b/src/main/java/moe/nea/pcj/json/UnknownSubtype.java @@ -0,0 +1,10 @@ +package moe.nea.pcj.json; + +import java.util.Set; + +public record UnknownSubtype<T>(T actual, Set<T> expectedTypes) implements JsonLikeError { + @SafeVarargs + public UnknownSubtype(T actual, T... expected) { + this(actual, Set.of(expected)); + } +} |