summaryrefslogtreecommitdiff
path: root/src/main/java/moe/nea/pcj
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-11-14 21:50:10 +0100
committerLinnea Gräf <nea@nea.moe>2024-11-14 21:50:10 +0100
commit63cb7a0e19e7afd06637dddb848d0254cbff5795 (patch)
tree81ce70514027a88456ae8635c65954afabbdfcee /src/main/java/moe/nea/pcj
parent742a354000241d25406ffbe9a38f9eb2e6d0e128 (diff)
downloadprofunctor-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/java/moe/nea/pcj')
-rw-r--r--src/main/java/moe/nea/pcj/json/DuringKeyExtraction.java4
-rw-r--r--src/main/java/moe/nea/pcj/json/InSubType.java4
-rw-r--r--src/main/java/moe/nea/pcj/json/MapCodec.java24
-rw-r--r--src/main/java/moe/nea/pcj/json/UnknownSubtype.java10
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));
+ }
+}