Skip to content

Commit

Permalink
Update owo config to pass both ReflectiveEndecBuilder and Jankson.Bui…
Browse files Browse the repository at this point in the history
…lder with a helper method for adding an endec to both

Keep backwards compatiblity
  • Loading branch information
Dragon-Seeker committed Sep 26, 2024
1 parent 5c5709f commit f3a02f4
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 13 deletions.
9 changes: 5 additions & 4 deletions src/main/java/io/wispforest/owo/config/ConfigAP.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -45,8 +46,8 @@ public class {wrapper_class_name} extends ConfigWrapper<{config_class_name}> {
super({config_class_name}.class);
}
private {wrapper_class_name}(Consumer<Jankson.Builder> 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() {
Expand All @@ -55,8 +56,8 @@ public class {wrapper_class_name} extends ConfigWrapper<{config_class_name}> {
return wrapper;
}
public static {wrapper_class_name} createAndLoad(Consumer<Jankson.Builder> 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;
}
Expand Down
46 changes: 38 additions & 8 deletions src/main/java/io/wispforest/owo/config/ConfigWrapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -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;

/**
Expand Down Expand Up @@ -61,23 +65,34 @@ public abstract class ConfigWrapper<C> {

protected final ReflectiveEndecBuilder builder;

@Deprecated
protected ConfigWrapper(Class<C> clazz, Consumer<Jankson.Builder> janksonBuilder) {
this(clazz, (SerializationBuilder serializationBuilder) -> janksonBuilder.accept(serializationBuilder.janksonBuilder()));
}

protected ConfigWrapper(Class<C> clazz) {
this(clazz, builder -> {});
this(clazz, (SerializationBuilder builder) -> {});
}

protected ConfigWrapper(Class<C> clazz, Consumer<Jankson.Builder> janksonBuilder) {
protected ConfigWrapper(Class<C> 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();
Expand Down Expand Up @@ -366,4 +381,19 @@ public boolean test(Object value) {
}
}

public record SerializationBuilder(Jankson.Builder janksonBuilder, ReflectiveEndecBuilder endecBuilder) {
public <T> SerializationBuilder addEndec(Class<T> clazz, Endec<T> 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);
}
}
6 changes: 6 additions & 0 deletions src/main/java/io/wispforest/owo/ui/core/Color.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,6 +16,11 @@

public record Color(float red, float green, float blue, float alpha) implements Animatable<Color> {

public static final Endec<Color> 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);
Expand Down
2 changes: 1 addition & 1 deletion src/testmod/java/io/wispforest/uwu/Uwu.java
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit f3a02f4

Please sign in to comment.