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 /gson/src/main/java/moe/nea | |
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 'gson/src/main/java/moe/nea')
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)); + } +} |