summaryrefslogtreecommitdiff
path: root/gson/src/main/java/moe/nea
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 /gson/src/main/java/moe/nea
parent94e30f7ffbafcdd188d09d8c7bf7e4794b650018 (diff)
downloadprofunctor-codecs-java-ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3.tar.gz
profunctor-codecs-java-ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3.tar.bz2
profunctor-codecs-java-ed8eb00566a5e3b7f2d5564d7977a4b3ec8fe5b3.zip
wip
Diffstat (limited to 'gson/src/main/java/moe/nea')
-rw-r--r--gson/src/main/java/moe/nea/jcp/gson/GsonCodecs.java10
-rw-r--r--gson/src/main/java/moe/nea/jcp/gson/GsonListBuilder.java27
-rw-r--r--gson/src/main/java/moe/nea/jcp/gson/GsonListView.java21
-rw-r--r--gson/src/main/java/moe/nea/jcp/gson/GsonOperations.java63
-rw-r--r--gson/src/main/java/moe/nea/jcp/gson/GsonRecordBuilder.java47
-rw-r--r--gson/src/main/java/moe/nea/jcp/gson/GsonRecordView.java24
6 files changed, 170 insertions, 22 deletions
diff --git a/gson/src/main/java/moe/nea/jcp/gson/GsonCodecs.java b/gson/src/main/java/moe/nea/jcp/gson/GsonCodecs.java
new file mode 100644
index 0000000..616d713
--- /dev/null
+++ b/gson/src/main/java/moe/nea/jcp/gson/GsonCodecs.java
@@ -0,0 +1,10 @@
+package moe.nea.jcp.gson;
+
+import com.google.gson.JsonElement;
+import moe.nea.pcj.json.BasicCodecs;
+
+public class GsonCodecs extends BasicCodecs<JsonElement> {
+ protected GsonCodecs() {}
+
+ public static final GsonCodecs INSTANCE = new GsonCodecs();
+}
diff --git a/gson/src/main/java/moe/nea/jcp/gson/GsonListBuilder.java b/gson/src/main/java/moe/nea/jcp/gson/GsonListBuilder.java
new file mode 100644
index 0000000..d1a6302
--- /dev/null
+++ b/gson/src/main/java/moe/nea/jcp/gson/GsonListBuilder.java
@@ -0,0 +1,27 @@
+package moe.nea.jcp.gson;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import moe.nea.pcj.json.ListBuilder;
+
+public class GsonListBuilder extends GsonListView implements ListBuilder<JsonArray, JsonElement> {
+
+ public GsonListBuilder() {
+ super(new JsonArray());
+ }
+
+ @Override
+ public JsonArray complete() {
+ return jsonArray;
+ }
+
+ @Override
+ public void add(JsonElement value) {
+ jsonArray.add(value);
+ }
+
+ @Override
+ public void set(int index, JsonElement value) {
+ jsonArray.set(index, value);
+ }
+}
diff --git a/gson/src/main/java/moe/nea/jcp/gson/GsonListView.java b/gson/src/main/java/moe/nea/jcp/gson/GsonListView.java
new file mode 100644
index 0000000..2a0dcf5
--- /dev/null
+++ b/gson/src/main/java/moe/nea/jcp/gson/GsonListView.java
@@ -0,0 +1,21 @@
+package moe.nea.jcp.gson;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import moe.nea.pcj.json.ListView;
+
+public class GsonListView implements ListView<JsonElement> {
+ final JsonArray jsonArray;
+
+ public GsonListView(JsonArray jsonArray) {this.jsonArray = jsonArray;}
+
+ @Override
+ public int length() {
+ return jsonArray.size();
+ }
+
+ @Override
+ public JsonElement getUnsafe(int index) {
+ return jsonArray.get(index);
+ }
+}
diff --git a/gson/src/main/java/moe/nea/jcp/gson/GsonOperations.java b/gson/src/main/java/moe/nea/jcp/gson/GsonOperations.java
index 7d81b9f..7957d05 100644
--- a/gson/src/main/java/moe/nea/jcp/gson/GsonOperations.java
+++ b/gson/src/main/java/moe/nea/jcp/gson/GsonOperations.java
@@ -1,15 +1,19 @@
package moe.nea.jcp.gson;
+import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
-import moe.nea.pcj.JsonLikeError;
-import moe.nea.pcj.JsonLikeOperations;
-import moe.nea.pcj.ListBuilder;
-import moe.nea.pcj.ListView;
-import moe.nea.pcj.RecordBuilder;
-import moe.nea.pcj.RecordView;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import moe.nea.pcj.json.JsonLikeError;
+import moe.nea.pcj.json.JsonLikeOperations;
+import moe.nea.pcj.json.ListBuilder;
+import moe.nea.pcj.json.ListView;
+import moe.nea.pcj.json.RecordBuilder;
+import moe.nea.pcj.json.RecordView;
import moe.nea.pcj.Result;
import moe.nea.pcj.Unit;
+import moe.nea.pcj.json.UnexpectedJsonElement;
public class GsonOperations implements JsonLikeOperations<JsonElement> {
@Override
@@ -20,56 +24,71 @@ public class GsonOperations implements JsonLikeOperations<JsonElement> {
@Override
public Result<Unit, ? extends JsonLikeError> getNull(JsonElement element) {
if (element.isJsonNull()) return Result.ok(Unit.INSTANCE);
- return Result.fail();
+ return Result.fail(new UnexpectedJsonElement("null", element));
}
@Override
public JsonElement createNumeric(Number value) {
- return null;
+ return new JsonPrimitive(value);
}
@Override
- public Result<Number, ? extends JsonLikeError> getInt(JsonElement element) {
- return null;
+ public Result<Number, ? extends JsonLikeError> getNumeric(JsonElement element) {
+ if (element instanceof JsonPrimitive primitive && primitive.isNumber()) {
+ return Result.ok(primitive.getAsNumber());
+ }
+ return Result.fail(new UnexpectedJsonElement("number", element));
}
@Override
public JsonElement createString(String value) {
- return null;
+ return new JsonPrimitive(value);
}
@Override
public Result<String, ? extends JsonLikeError> getString(JsonElement element) {
- return null;
+ if (element instanceof JsonPrimitive primitive && primitive.isString()) {
+ return Result.ok(primitive.getAsString());
+ }
+ return Result.fail(new UnexpectedJsonElement("string", element));
}
@Override
public JsonElement createBoolean(boolean value) {
- return null;
+ return new JsonPrimitive(value);
}
@Override
public Result<Boolean, ? extends JsonLikeError> getBoolean(JsonElement jsonElement) {
- return null;
+ if (jsonElement instanceof JsonPrimitive primitive && primitive.isBoolean()) {
+ return Result.ok(primitive.getAsBoolean());
+ }
+ return Result.fail(new UnexpectedJsonElement("boolean", jsonElement));
}
@Override
- public RecordBuilder<? extends JsonElement, JsonElement> createObject() {
- return null;
+ public RecordBuilder<JsonElement> createObject() {
+ return new GsonRecordBuilder();
}
@Override
- public Result<RecordView<? extends JsonElement>, ? extends JsonLikeError> getObject(JsonElement jsonElement) {
- return null;
+ public Result<RecordView<JsonElement>, ? extends JsonLikeError> getObject(JsonElement jsonElement) {
+ if (jsonElement instanceof JsonObject object) {
+ return Result.ok(new GsonRecordView(object));
+ }
+ return Result.fail(new UnexpectedJsonElement("object", jsonElement));
}
@Override
- public ListBuilder<? extends JsonElement, JsonElement> createList() {
- return null;
+ public ListBuilder<JsonArray, JsonElement> createList() {
+ return new GsonListBuilder();
}
@Override
- public Result<ListView<? extends JsonElement>, ? extends JsonLikeError> getList(JsonElement jsonElement) {
- return null;
+ public Result<ListView<JsonElement>, ? extends JsonLikeError> getList(JsonElement jsonElement) {
+ if (jsonElement instanceof JsonArray array) {
+ return Result.ok(new GsonListView(array));
+ }
+ return Result.fail(new UnexpectedJsonElement("list", jsonElement));
}
}
diff --git a/gson/src/main/java/moe/nea/jcp/gson/GsonRecordBuilder.java b/gson/src/main/java/moe/nea/jcp/gson/GsonRecordBuilder.java
new file mode 100644
index 0000000..ded1953
--- /dev/null
+++ b/gson/src/main/java/moe/nea/jcp/gson/GsonRecordBuilder.java
@@ -0,0 +1,47 @@
+package moe.nea.jcp.gson;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import moe.nea.pcj.Result;
+import moe.nea.pcj.Unit;
+import moe.nea.pcj.json.DuplicateJsonKey;
+import moe.nea.pcj.json.JsonLikeError;
+import moe.nea.pcj.json.RecordBuilder;
+
+import java.util.stream.Stream;
+
+public class GsonRecordBuilder extends GsonRecordView implements RecordBuilder<JsonElement> {
+ public GsonRecordBuilder() {
+ super(new JsonObject());
+ }
+
+ boolean completed = false;
+
+ @Override
+ public Result<RecordBuilder<JsonElement>, JsonLikeError> mergeWith(RecordBuilder<JsonElement> other) {
+ var next = new GsonRecordBuilder();
+ return Result.cast(Stream.of(this.complete(), other.complete())
+ .flatMap(it -> ((JsonObject) it).entrySet().stream())
+ .map(it -> next.add(it.getKey(), it.getValue()))
+ .reduce((left, right) -> left.appendErrors(right.errors()))
+ .map(it -> it.map(unit -> next))
+ .orElse(Result.ok(next)));
+ }
+
+ @Override
+ public Result<Unit, JsonLikeError> add(String key, JsonElement value) {
+ if (completed) throw new IllegalStateException("JsonObject already completed");
+ if (jsonObject.has(key))
+ return Result.fail(new DuplicateJsonKey(key));
+ jsonObject.add(key, value);
+ return Result.ok(Unit.INSTANCE);
+ }
+
+ @Override
+ public JsonObject complete() {
+ if (completed)
+ throw new IllegalStateException("JsonObject already completed");
+ completed = true;
+ return jsonObject;
+ }
+}
diff --git a/gson/src/main/java/moe/nea/jcp/gson/GsonRecordView.java b/gson/src/main/java/moe/nea/jcp/gson/GsonRecordView.java
new file mode 100644
index 0000000..b20d0a7
--- /dev/null
+++ b/gson/src/main/java/moe/nea/jcp/gson/GsonRecordView.java
@@ -0,0 +1,24 @@
+package moe.nea.jcp.gson;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import moe.nea.pcj.json.RecordView;
+
+import java.util.Collection;
+import java.util.Optional;
+
+public class GsonRecordView implements RecordView<JsonElement> {
+ final JsonObject jsonObject;
+
+ public GsonRecordView(JsonObject jsonObject) {this.jsonObject = jsonObject;}
+
+ @Override
+ public Collection<String> getKeys() {
+ return jsonObject.keySet();
+ }
+
+ @Override
+ public Optional<JsonElement> get(String key) {
+ return Optional.ofNullable(jsonObject.get(key));
+ }
+}