From f3a02f4c863e8b873f1a93bcff8f4fd210a02a23 Mon Sep 17 00:00:00 2001 From: Dragon-Seeker Date: Wed, 25 Sep 2024 23:51:37 -0500 Subject: [PATCH] Update owo config to pass both ReflectiveEndecBuilder and Jankson.Builder with a helper method for adding an endec to both Keep backwards compatiblity --- .../io/wispforest/owo/config/ConfigAP.java | 9 ++-- .../wispforest/owo/config/ConfigWrapper.java | 46 +++++++++++++++---- .../java/io/wispforest/owo/ui/core/Color.java | 6 +++ src/testmod/java/io/wispforest/uwu/Uwu.java | 2 +- 4 files changed, 50 insertions(+), 13 deletions(-) diff --git a/src/main/java/io/wispforest/owo/config/ConfigAP.java b/src/main/java/io/wispforest/owo/config/ConfigAP.java index 9bd6f991..479e2051 100644 --- a/src/main/java/io/wispforest/owo/config/ConfigAP.java +++ b/src/main/java/io/wispforest/owo/config/ConfigAP.java @@ -28,6 +28,7 @@ public class ConfigAP extends AbstractProcessor { import blue.endless.jankson.Jankson; import io.wispforest.owo.config.ConfigWrapper; + import io.wispforest.owo.config.ConfigWrapper.BuilderConsumer; import io.wispforest.owo.config.Option; import io.wispforest.owo.util.Observable; @@ -45,8 +46,8 @@ public class {wrapper_class_name} extends ConfigWrapper<{config_class_name}> { super({config_class_name}.class); } - private {wrapper_class_name}(Consumer janksonBuilder) { - super({config_class_name}.class, janksonBuilder); + private {wrapper_class_name}(BuilderConsumer consumer) { + super({config_class_name}.class, consumer); } public static {wrapper_class_name} createAndLoad() { @@ -55,8 +56,8 @@ public class {wrapper_class_name} extends ConfigWrapper<{config_class_name}> { return wrapper; } - public static {wrapper_class_name} createAndLoad(Consumer janksonBuilder) { - var wrapper = new {wrapper_class_name}(janksonBuilder); + public static {wrapper_class_name} createAndLoad(BuilderConsumer consumer) { + var wrapper = new {wrapper_class_name}(consumer); wrapper.load(); return wrapper; } diff --git a/src/main/java/io/wispforest/owo/config/ConfigWrapper.java b/src/main/java/io/wispforest/owo/config/ConfigWrapper.java index 69e50d3c..f1fcbbcb 100644 --- a/src/main/java/io/wispforest/owo/config/ConfigWrapper.java +++ b/src/main/java/io/wispforest/owo/config/ConfigWrapper.java @@ -8,6 +8,9 @@ import blue.endless.jankson.api.SyntaxError; import blue.endless.jankson.impl.POJODeserializer; import blue.endless.jankson.magic.TypeMagic; +import io.wispforest.endec.Endec; +import io.wispforest.endec.format.jankson.JanksonDeserializer; +import io.wispforest.endec.format.jankson.JanksonSerializer; import io.wispforest.endec.impl.ReflectiveEndecBuilder; import io.wispforest.owo.Owo; import io.wispforest.owo.config.annotation.*; @@ -34,6 +37,7 @@ import java.util.*; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.function.Supplier; import java.util.regex.Pattern; /** @@ -61,23 +65,34 @@ public abstract class ConfigWrapper { protected final ReflectiveEndecBuilder builder; + @Deprecated + protected ConfigWrapper(Class clazz, Consumer janksonBuilder) { + this(clazz, (SerializationBuilder serializationBuilder) -> janksonBuilder.accept(serializationBuilder.janksonBuilder())); + } + protected ConfigWrapper(Class clazz) { - this(clazz, builder -> {}); + this(clazz, (SerializationBuilder builder) -> {}); } - protected ConfigWrapper(Class clazz, Consumer janksonBuilder) { + protected ConfigWrapper(Class clazz, BuilderConsumer consumer) { this.builder = MinecraftEndecs.addDefaults(new ReflectiveEndecBuilder()); ReflectionUtils.requireZeroArgsConstructor(clazz, s -> "Config model class " + s + " must provide a zero-args constructor"); this.instance = ReflectionUtils.tryInstantiateWithNoArgs(clazz); - var builder = Jankson.builder() + var janksonBuilder = Jankson.builder(); + + var builder = new SerializationBuilder(janksonBuilder, this.builder); + + builder.janksonBuilder() .registerSerializer(Identifier.class, (identifier, marshaller) -> new JsonPrimitive(identifier.toString())) - .registerDeserializer(JsonPrimitive.class, Identifier.class, (primitive, m) -> Identifier.tryParse(primitive.asString())) - .registerSerializer(Color.class, (color, marshaller) -> new JsonPrimitive(color.asHexString(true))) - .registerDeserializer(JsonPrimitive.class, Color.class, (primitive, m) -> Color.ofArgb(Integer.parseUnsignedInt(primitive.asString().substring(1), 16))); - janksonBuilder.accept(builder); - this.jankson = builder.build(); + .registerDeserializer(JsonPrimitive.class, Identifier.class, (primitive, m) -> Identifier.tryParse(primitive.asString())); + + builder.addEndec(Color.class, Color.RGBA_HEX_ENDEC); + + consumer.build(builder); + + this.jankson = janksonBuilder.build(); var configAnnotation = clazz.getAnnotation(Config.class); this.name = configAnnotation.name(); @@ -366,4 +381,19 @@ public boolean test(Object value) { } } + public record SerializationBuilder(Jankson.Builder janksonBuilder, ReflectiveEndecBuilder endecBuilder) { + public SerializationBuilder addEndec(Class clazz, Endec endec) { + endecBuilder().register(endec, clazz); + + janksonBuilder() + .registerSerializer(clazz, (t, marshaller) -> endec.encodeFully(JanksonSerializer::of, t)) + .registerDeserializer(JsonElement.class, clazz, (element, marshaller) -> endec.decodeFully(JanksonDeserializer::of, element)); + + return this; + } + } + + public interface BuilderConsumer { + void build(SerializationBuilder builder); + } } diff --git a/src/main/java/io/wispforest/owo/ui/core/Color.java b/src/main/java/io/wispforest/owo/ui/core/Color.java index e3d69766..07c21912 100644 --- a/src/main/java/io/wispforest/owo/ui/core/Color.java +++ b/src/main/java/io/wispforest/owo/ui/core/Color.java @@ -1,6 +1,7 @@ package io.wispforest.owo.ui.core; import com.google.common.collect.ImmutableMap; +import io.wispforest.endec.Endec; import io.wispforest.owo.ui.parsing.UIModelParsingException; import net.minecraft.util.DyeColor; import net.minecraft.util.Formatting; @@ -15,6 +16,11 @@ public record Color(float red, float green, float blue, float alpha) implements Animatable { + public static final Endec RGBA_HEX_ENDEC = Endec.STRING.xmap( + string -> Color.ofArgb(Integer.parseUnsignedInt(string.substring(1), 16)), + color -> color.asHexString(true) + ); + public static final Color BLACK = Color.ofRgb(0); public static final Color WHITE = Color.ofRgb(0xFFFFFF); public static final Color RED = Color.ofRgb(0xFF0000); diff --git a/src/testmod/java/io/wispforest/uwu/Uwu.java b/src/testmod/java/io/wispforest/uwu/Uwu.java index c5d28765..7dff9799 100644 --- a/src/testmod/java/io/wispforest/uwu/Uwu.java +++ b/src/testmod/java/io/wispforest/uwu/Uwu.java @@ -175,7 +175,7 @@ public class Uwu implements ModInitializer { public static final UwuConfig CONFIG = UwuConfig.createAndLoad(); public static final BruhConfig BRUHHHHH = BruhConfig.createAndLoad(builder -> { - builder.registerSerializer(Color.class, (color, marshaller) -> new JsonPrimitive("bruv")); + builder.janksonBuilder().registerSerializer(Color.class, (color, marshaller) -> new JsonPrimitive("bruv")); }); @Override