From a33b27e57d64b9d720bff62d5028b8b5adcece0e Mon Sep 17 00:00:00 2001 From: JFronny Date: Wed, 24 Apr 2024 17:53:10 +0200 Subject: [PATCH] feat: add lenient transport as alternative to manually setting SerializationMode --- .../java/io/gitlab/jfronny/libjf/LibJf.java | 3 +++ .../libjf/serialize/LenientTransport.java | 21 +++++++++++++++++++ .../config/impl/dsl/DefaultConfigIO.java | 7 ++----- .../impl/ui/tiny/TinyConfigScreenFactory.java | 7 +++---- .../ui/tiny/entry/EntryInfoWidgetBuilder.java | 8 +++---- 5 files changed, 32 insertions(+), 14 deletions(-) create mode 100644 libjf-base/src/main/java/io/gitlab/jfronny/libjf/serialize/LenientTransport.java diff --git a/libjf-base/src/main/java/io/gitlab/jfronny/libjf/LibJf.java b/libjf-base/src/main/java/io/gitlab/jfronny/libjf/LibJf.java index e60a4f8..89a179f 100644 --- a/libjf-base/src/main/java/io/gitlab/jfronny/libjf/LibJf.java +++ b/libjf-base/src/main/java/io/gitlab/jfronny/libjf/LibJf.java @@ -1,5 +1,6 @@ package io.gitlab.jfronny.libjf; +import com.sun.jdi.connect.Transport; import io.gitlab.jfronny.commons.Serializer; import io.gitlab.jfronny.commons.logger.DelegateLogger; import io.gitlab.jfronny.commons.logger.HotswapLoggerFinder; @@ -9,6 +10,7 @@ import io.gitlab.jfronny.commons.serialize.databind.ObjectMapper; import io.gitlab.jfronny.commons.serialize.json.JsonTransport; import io.gitlab.jfronny.libjf.log.JULBridge; import io.gitlab.jfronny.libjf.log.SLF4JPlatformLogger; +import io.gitlab.jfronny.libjf.serialize.LenientTransport; import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint; import org.slf4j.LoggerFactory; @@ -17,6 +19,7 @@ public class LibJf implements PreLaunchEntrypoint { public static final SystemLoggerPlus LOGGER = SystemLoggerPlus.forName(MOD_ID); public static final ObjectMapper MAPPER = new ObjectMapper(); public static final JsonTransport JSON_TRANSPORT = new JsonTransport(); + public static final JsonTransport LENIENT_TRANSPORT = new LenientTransport(); static { Serializer.setInstance(new DatabindSerializer<>(JSON_TRANSPORT, MAPPER)); diff --git a/libjf-base/src/main/java/io/gitlab/jfronny/libjf/serialize/LenientTransport.java b/libjf-base/src/main/java/io/gitlab/jfronny/libjf/serialize/LenientTransport.java new file mode 100644 index 0000000..601d6c5 --- /dev/null +++ b/libjf-base/src/main/java/io/gitlab/jfronny/libjf/serialize/LenientTransport.java @@ -0,0 +1,21 @@ +package io.gitlab.jfronny.libjf.serialize; + +import io.gitlab.jfronny.commons.serialize.json.JsonReader; +import io.gitlab.jfronny.commons.serialize.json.JsonTransport; +import io.gitlab.jfronny.commons.serialize.json.JsonWriter; + +import java.io.IOException; +import java.io.Reader; +import java.io.Writer; + +public class LenientTransport extends JsonTransport { + @Override + public JsonWriter createWriter(Writer target) throws IOException { + return SerializationMode.asConfig(super.createWriter(target)); + } + + @Override + public JsonReader createReader(Reader source) { + return SerializationMode.asConfig(super.createReader(source)); + } +} diff --git a/libjf-config-core-v2/src/main/java/io/gitlab/jfronny/libjf/config/impl/dsl/DefaultConfigIO.java b/libjf-config-core-v2/src/main/java/io/gitlab/jfronny/libjf/config/impl/dsl/DefaultConfigIO.java index 98ec729..61365b8 100644 --- a/libjf-config-core-v2/src/main/java/io/gitlab/jfronny/libjf/config/impl/dsl/DefaultConfigIO.java +++ b/libjf-config-core-v2/src/main/java/io/gitlab/jfronny/libjf/config/impl/dsl/DefaultConfigIO.java @@ -8,7 +8,6 @@ import io.gitlab.jfronny.libjf.LibJf; import io.gitlab.jfronny.libjf.config.api.v2.*; import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe; import io.gitlab.jfronny.libjf.config.impl.watch.JfConfigWatchService; -import io.gitlab.jfronny.libjf.serialize.SerializationMode; import java.io.*; import java.nio.file.Files; @@ -21,8 +20,7 @@ public class DefaultConfigIO { // Actions cannot be cached since entries can change if (Files.exists(path)) { try (BufferedReader br = Files.newBufferedReader(path); - JsonReader jr = new JsonReader(br)) { - SerializationMode.asConfig(jr); + JsonReader jr = LibJf.LENIENT_TRANSPORT.createReader(br)) { runActions(id, createActions(c), jr); } catch (Exception e) { LibJf.LOGGER.error("Could not read config for " + id, e); @@ -94,8 +92,7 @@ public class DefaultConfigIO { public static Consumer writer(String id) { return c -> c.getFilePath().ifPresent(path -> JfConfigWatchService.lock(path, () -> { try (BufferedWriter bw = Files.newBufferedWriter(path); - JsonWriter jw = new JsonWriter(bw)) { - SerializationMode.asConfig(jw); + JsonWriter jw = LibJf.LENIENT_TRANSPORT.createWriter(bw)) { writeTo(jw, c); } catch (Exception e) { LibJf.LOGGER.error("Could not write config for " + id, e); diff --git a/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/TinyConfigScreenFactory.java b/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/TinyConfigScreenFactory.java index 1a0b480..720759e 100644 --- a/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/TinyConfigScreenFactory.java +++ b/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/TinyConfigScreenFactory.java @@ -10,7 +10,6 @@ import io.gitlab.jfronny.libjf.config.api.v2.EntryInfo; import io.gitlab.jfronny.libjf.config.api.v2.dsl.CategoryBuilder; import io.gitlab.jfronny.libjf.config.api.v2.type.Type; import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory; -import io.gitlab.jfronny.libjf.serialize.SerializationMode; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.resource.language.I18n; @@ -33,7 +32,7 @@ public class TinyConfigScreenFactory implements ConfigScreenFactory LibJf.MAPPER.serialize(value, SerializationMode.asConfig(writer))); + jsonified = LibJf.LENIENT_TRANSPORT.write(writer -> LibJf.MAPPER.serialize(value, writer)); } catch (IllegalAccessException | IOException e) { throw new RuntimeException(e); } @@ -45,11 +44,11 @@ public class TinyConfigScreenFactory implements ConfigScreenFactory { try { - entry.setValue(LibJf.JSON_TRANSPORT.read( + entry.setValue(LibJf.LENIENT_TRANSPORT.read( json, (Transport.Returnable) reader -> LibJf.MAPPER .getAdapter(TypeToken.get(type.asClass())) - .deserialize(SerializationMode.asConfig(reader)))); + .deserialize(reader))); entry.setValue(Serializer.getInstance().deserialize(json, type.asClass())); config.write(); } catch (Throwable e) { diff --git a/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/entry/EntryInfoWidgetBuilder.java b/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/entry/EntryInfoWidgetBuilder.java index 575b4c5..4b8713a 100644 --- a/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/entry/EntryInfoWidgetBuilder.java +++ b/libjf-config-ui-tiny/src/client/java/io/gitlab/jfronny/libjf/config/impl/ui/tiny/entry/EntryInfoWidgetBuilder.java @@ -9,11 +9,9 @@ import io.gitlab.jfronny.commons.throwable.Try; import io.gitlab.jfronny.libjf.LibJf; import io.gitlab.jfronny.libjf.config.api.v2.ConfigCategory; import io.gitlab.jfronny.libjf.config.api.v2.EntryInfo; -import io.gitlab.jfronny.libjf.config.api.v2.JfConfig; import io.gitlab.jfronny.libjf.config.api.v2.type.Type; import io.gitlab.jfronny.libjf.config.impl.ConfigCore; import io.gitlab.jfronny.libjf.config.impl.ui.tiny.EditorScreen; -import io.gitlab.jfronny.libjf.serialize.SerializationMode; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.widget.ButtonWidget; @@ -177,7 +175,7 @@ public class EntryInfoWidgetBuilder { final String jsonified; if (state.tempValue == null) { try { - jsonified = LibJf.JSON_TRANSPORT.write(writer -> LibJf.MAPPER.serialize(state.cachedValue, SerializationMode.asConfig(writer))); + jsonified = LibJf.LENIENT_TRANSPORT.write(writer -> LibJf.MAPPER.serialize(state.cachedValue, writer)); } catch (Throwable e) { LibJf.LOGGER.error("Could not stringify element", e); SystemToast.add( @@ -199,11 +197,11 @@ public class EntryInfoWidgetBuilder { jsonified, json -> { try { - state.updateCache(LibJf.JSON_TRANSPORT.read( + state.updateCache(LibJf.LENIENT_TRANSPORT.read( json, (Transport.Returnable) reader -> LibJf.MAPPER .getAdapter((TypeToken) TypeToken.get(info.getValueType().asClass())) - .deserialize(SerializationMode.asConfig(reader)))); + .deserialize(reader))); state.tempValue = null; } catch (Throwable e) { LibJf.LOGGER.error("Could not write element", e);