feat: add lenient transport as alternative to manually setting SerializationMode
ci/woodpecker/push/docs Pipeline was successful Details
ci/woodpecker/push/jfmod Pipeline was successful Details
ci/woodpecker/tag/docs Pipeline was successful Details
ci/woodpecker/tag/jfmod Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2024-04-24 17:53:10 +02:00
parent bd30200197
commit a33b27e57d
Signed by: Johannes
GPG Key ID: E76429612C2929F4
5 changed files with 32 additions and 14 deletions

View File

@ -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));

View File

@ -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));
}
}

View File

@ -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<ConfigInstance> 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);

View File

@ -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<Screen, Tiny
final String jsonified;
try {
var value = entry.getValue();
jsonified = LibJf.JSON_TRANSPORT.write(writer -> 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<Screen, Tiny
jsonified,
json -> {
try {
entry.setValue(LibJf.JSON_TRANSPORT.read(
entry.setValue(LibJf.LENIENT_TRANSPORT.read(
json,
(Transport.Returnable<JsonReader, ? extends Object, IOException>) 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) {

View File

@ -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<JsonReader, ? extends T, IOException>) reader -> LibJf.MAPPER
.getAdapter((TypeToken<T>) 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);