Skip to content

Commit 138fe49

Browse files
committed
new decoder struction
new decode struction
1 parent 918a3e8 commit 138fe49

24 files changed

+1225
-56
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
org.gradle.jvmargs = -Xmx3G
66

77
java_version = 21
8-
cleanroom_version=0.2.3-alpha
8+
cleanroom_version=0.2.4-alpha
99

1010
# Mapping Properties
1111
mapping_channel= stable

src/main/java/rml/deserializer/AbstractDeserializer.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package rml.deserializer;
22

3-
import com.google.gson.JsonElement;
43
import net.minecraft.util.ResourceLocation;
4+
import rml.deserializer.struct.std.StructElement;
55
import rml.jrx.announces.EarlyClass;
66
import rml.jrx.announces.PublicAPI;
77

@@ -24,7 +24,7 @@ public AbstractDeserializer(ResourceLocation registerName, Class<T> target, IDes
2424
public Class<T> getResultTarget(){
2525
return this.target;
2626
}
27-
public T deserialize(JsonElement json) throws JsonDeserializeException {
27+
public T deserialize(StructElement json) throws JsonDeserializeException {
2828
return this.function.apply(json);
2929
}
3030

@@ -34,7 +34,7 @@ public ResourceLocation getRegisterName(){
3434

3535
@FunctionalInterface
3636
public interface IDeserializer<V>{
37-
V apply(JsonElement jsonElement) throws JsonDeserializeException;
37+
V apply(StructElement jsonElement) throws JsonDeserializeException;
3838
}
3939

4040
public static <T> IDeserializer<T> safeRun(IDeserializer<T> deserializer){

src/main/java/rml/deserializer/Argument.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import com.google.common.collect.Lists;
44
import com.google.gson.JsonElement;
55
import com.google.gson.JsonObject;
6+
import rml.deserializer.struct.std.StructElement;
7+
import rml.deserializer.struct.std.StructObject;
68
import rml.jrx.announces.EarlyClass;
79
import rml.jrx.announces.PublicAPI;
810

@@ -35,8 +37,8 @@ public T cast(DeserializerBuilder.Context context) {
3537
public static <E> Argument<E> type(String name, Class<E> clazz) {
3638
return new Argument<E>(name) {
3739
@Override
38-
public void execute(DeserializerManager manager, JsonObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
39-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
40+
public void execute(DeserializerManager manager, StructObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
41+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
4042
if (element != null){
4143
try {
4244
final Class<?> clazz2 = DeserializerBuilder.avoidPrimitive(clazz);
@@ -56,7 +58,7 @@ public static Argument<Integer> integer(String name, Function<Integer, Throwable
5658
return new Argument<Integer>(name) {
5759
@Override
5860
public void execute(DeserializerManager manager, JsonObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
59-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
61+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
6062
if (element != null){
6163
Integer obj = null;
6264
try {
@@ -92,8 +94,8 @@ public static Argument<Integer> positiveInteger(String name) {
9294
public static Argument<Float> floatArgument(String name, Function<Float, Throwable> predicate){
9395
return new Argument<Float>(name) {
9496
@Override
95-
public void execute(DeserializerManager manager, JsonObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
96-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
97+
public void execute(DeserializerManager manager, StructObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
98+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
9799
if (element != null){
98100
Float obj = null;
99101
try{
@@ -129,8 +131,8 @@ public static Argument<Float> positiveFloat(String name){
129131
public static Argument<Boolean> bool(String name, Function<Boolean, Throwable> predicate){
130132
return new Argument<Boolean>(name) {
131133
@Override
132-
public void execute(DeserializerManager manager, JsonObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
133-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
134+
public void execute(DeserializerManager manager, StructObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
135+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
134136
if (element != null){
135137
Boolean obj = null;
136138
try{
@@ -154,12 +156,12 @@ public void execute(DeserializerManager manager, JsonObject jsonObject, Deserial
154156
public static<T> Argument<Map<String, T>> map(String name, final Class<T> clazz){
155157
return new Argument<Map<String, T>>(name) {
156158
@Override
157-
public void execute(DeserializerManager manager, JsonObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
158-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
159+
public void execute(DeserializerManager manager, StructObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
160+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
159161
if (element != null){
160-
if (!element.isJsonObject()) throw new JsonDeserializeException(jsonObject, "field" + name + "is required be json object.");
162+
if (!element.isObject()) throw new JsonDeserializeException(jsonObject, "field" + name + "is required be json object.");
161163
try {
162-
Map<String, T> map = element.getAsJsonObject().entrySet().stream().collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> manager.decodeSilently(clazz, entry.getValue())));
164+
Map<String, T> map = element.getAsObject().entrySet().stream().collect(Collectors.toMap((entry) -> entry.getKey(), (entry) -> manager.decodeSilently(clazz, entry.getValue())));
163165
context.put(name, map);
164166
}catch (Exception e){
165167
throw new JsonDeserializeException(element, e);
@@ -174,8 +176,8 @@ public void execute(DeserializerManager manager, JsonObject jsonObject, Deserial
174176
public static<T> Argument<List<T>> list(String name, final Class<T> clazz){
175177
return new Argument<List<T>>(name) {
176178
@Override
177-
public void execute(DeserializerManager manager, JsonObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
178-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
179+
public void execute(DeserializerManager manager, StructObject jsonObject, DeserializerBuilder.Context context) throws JsonDeserializeException {
180+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
179181
if (element != null){
180182
try {
181183
Class<?> arrayCls = Array.newInstance(clazz, 0).getClass();

src/main/java/rml/deserializer/DeserializerBuilder.java

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.google.gson.JsonElement;
55
import com.google.gson.JsonObject;
66
import net.minecraft.util.ResourceLocation;
7+
import rml.deserializer.struct.std.StructElement;
8+
import rml.deserializer.struct.std.StructObject;
79
import rml.internal.net.minecraftforge.common.util.LazyOptional;
810
import rml.jrx.announces.EarlyClass;
911
import rml.jrx.announces.PublicAPI;
@@ -23,10 +25,10 @@
2325
@EarlyClass
2426
@PublicAPI
2527
public class DeserializerBuilder<T> {
26-
private DeserializerManager manager;
27-
private Class<T> clazz;
28-
private ResourceLocation resourceLocation;
29-
private HashSet<IAction> actions = new HashSet<>();
28+
private final DeserializerManager manager;
29+
private final Class<T> clazz;
30+
private final ResourceLocation resourceLocation;
31+
private final HashSet<IAction> actions = new HashSet<>();
3032
private IJsonObjectFunction<T> function = (context) -> null;
3133
private boolean isDefault = false;
3234
public DeserializerBuilder(DeserializerManager manager, Class<T> clazz, ResourceLocation resourceLocation){
@@ -58,7 +60,7 @@ public DeserializerBuilder<T> check(final Function<Context, JsonDeserializeExcep
5860
public DeserializerBuilder<T> optionalWhen(final Class<?> clazz,final String name,final Context.ToBooleanFunction isNotRequired){
5961
final Class<?> type = DeserializerBuilder.avoidPrimitive(clazz);
6062
return this.action(((manager, jsonObject, context) -> {
61-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
63+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
6264
if (element != null){
6365
try{
6466
Object obj = manager.decode(type, element);
@@ -93,7 +95,7 @@ public DeserializerBuilder<T> optional(Class<?> clazz, String name){
9395
public <V> DeserializerBuilder<T> optionalDefaultWhen(final Class<V> clazz, final String name, final Context.ToBooleanFunction isNotRequired, final V defaultValue){
9496
final Class<?> type = DeserializerBuilder.avoidPrimitive(clazz);
9597
return this.action(((manager, jsonObject, context) -> {
96-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
98+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
9799
if (element != null){
98100
try{
99101
Object obj = manager.decode(type, element);
@@ -116,7 +118,7 @@ public <V> DeserializerBuilder<T> optionalDefault(Class<V> clazz, String name, V
116118
public <V> DeserializerBuilder<T> optionalDefaultLazyWhen(final Class<V> clazz, final String name, final Context.ToBooleanFunction isNotRequired, final LazyOptional<V> defaultValue){
117119
final Class<?> type = DeserializerBuilder.avoidPrimitive(clazz);
118120
return this.action(((manager, jsonObject, context) -> {
119-
JsonElement element = DeserializerManager.getFromPath(jsonObject, name);
121+
StructElement element = DeserializerManager.getFromPath(jsonObject, name);
120122
if (element != null){
121123
try{
122124
Object obj = manager.decode(type, element);
@@ -239,8 +241,8 @@ public void put(String s, Object obj){
239241

240242
@FunctionalInterface
241243
public interface ToBooleanFunction{
242-
ToBooleanFunction TRUE = (o)->true;
243-
ToBooleanFunction FALSE = (o)->false;
244+
ToBooleanFunction TRUE = (o) -> true;
245+
ToBooleanFunction FALSE = (o) -> false;
244246
boolean apply(Context context);
245247
}
246248

@@ -249,7 +251,7 @@ public interface ToBooleanFunction{
249251

250252
@FunctionalInterface
251253
public interface IAction{
252-
void execute(DeserializerManager manager, JsonObject jsonObject, Context context) throws JsonDeserializeException;
254+
void execute(DeserializerManager manager, StructObject jsonObject, Context context) throws JsonDeserializeException;
253255
}
254256

255257
@FunctionalInterface

src/main/java/rml/deserializer/DeserializerManager.java

Lines changed: 26 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import com.google.gson.JsonElement;
55
import com.google.gson.JsonObject;
66
import net.minecraft.util.ResourceLocation;
7+
import rml.deserializer.struct.std.StructArray;
8+
import rml.deserializer.struct.std.StructElement;
9+
import rml.deserializer.struct.std.StructObject;
710
import rml.jrx.announces.EarlyClass;
811
import rml.jrx.announces.PublicAPI;
912
import rml.jrx.utils.ClassHelper;
@@ -81,15 +84,15 @@ public <T> AbstractDeserializer<T> addDefaultEntry(AbstractDeserializer<T> abst
8184
*
8285
* @throws JsonDeserializeException the exception. Error format? Unexpected context?
8386
*/
84-
public <T> T decode(Class<T> clazz, JsonElement jsonElement) throws JsonDeserializeException {
87+
public <T> T decode(Class<T> clazz, StructElement jsonElement) throws JsonDeserializeException {
8588
ClassHelper.forceInitAll(clazz);
8689
clazz = DeserializerBuilder.avoidPrimitive(clazz);
8790

8891
try {
8992
if (clazz.isArray()){
9093
Class<?> clazzComponentType = clazz.getComponentType();
91-
if (jsonElement.isJsonArray()){
92-
JsonArray array = jsonElement.getAsJsonArray();
94+
if (jsonElement.isArray()){
95+
StructArray array = jsonElement.getAsArray();
9396
Object arrayToReturn = Array.newInstance(clazzComponentType, array.size());
9497
for(int index = 0 ; index < array.size() ; index++){
9598
Array.set(arrayToReturn, index, decode(clazzComponentType, array.get(index)));
@@ -101,9 +104,9 @@ public <T> T decode(Class<T> clazz, JsonElement jsonElement) throws JsonDeserial
101104
return clazz.cast(arrayToReturn);
102105
}
103106
} else {
104-
if (jsonElement.isJsonObject()){
105-
JsonObject jsonObject = jsonElement.getAsJsonObject();
106-
if (jsonObject.has("type")){
107+
if (jsonElement.isObject()){
108+
StructObject jsonObject = jsonElement.getAsObject();
109+
if (jsonObject.containsKey("type")){
107110
ResourceLocation decoderName = parseLocation(jsonObject.get("type").getAsString());
108111
if (!registry.containsKey(clazz)) throw new JsonDeserializeException(jsonObject, "Deserializer for " + clazz +" , is not registered.");
109112
HashMap<ResourceLocation, AbstractDeserializer<?>> typedRegistry = registry.get(clazz);
@@ -131,7 +134,7 @@ public <T> T decode(Class<T> clazz, JsonElement jsonElement) throws JsonDeserial
131134
}
132135

133136

134-
public <T> T decodeSilently(Class<T> clazz, JsonElement jsonElement){
137+
public <T> T decodeSilently(Class<T> clazz, StructElement jsonElement){
135138
JsonDeserializeException exception = null;
136139
try {
137140
return decode(clazz, jsonElement);
@@ -160,20 +163,19 @@ public DeserializerManager(String defaultDomain){
160163
public DeserializerManager(String defaultDomain, Consumer<DeserializerManager> consumer){
161164
this.defaultDomain = defaultDomain;
162165
ResourceLocation GSON = new ResourceLocation("google", "primitive");
163-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Integer.class, AbstractDeserializer.safeRun(JsonElement::getAsInt)));
164-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Float.class, AbstractDeserializer.safeRun(JsonElement::getAsFloat)));
165-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Double.class, AbstractDeserializer.safeRun(JsonElement::getAsDouble)));
166-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Long.class, AbstractDeserializer.safeRun(JsonElement::getAsLong)));
167-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Character.class, AbstractDeserializer.safeRun(JsonElement::getAsCharacter)));
168-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Byte.class, AbstractDeserializer.safeRun(JsonElement::getAsByte)));
169-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, String.class, AbstractDeserializer.safeRun(JsonElement::getAsString)));
170-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Boolean.class, AbstractDeserializer.safeRun(JsonElement::getAsBoolean)));
171-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Short.class, AbstractDeserializer.safeRun(JsonElement::getAsShort)));
172-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, BigInteger.class, AbstractDeserializer.safeRun(JsonElement::getAsBigInteger)));
173-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, BigDecimal.class, AbstractDeserializer.safeRun(JsonElement::getAsBigDecimal)));
174-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Number.class, AbstractDeserializer.safeRun(JsonElement::getAsNumber)));
166+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Integer.class, AbstractDeserializer.safeRun(StructElement::getAsInteger)));
167+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Float.class, AbstractDeserializer.safeRun(StructElement::getAsFloat)));
168+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Double.class, AbstractDeserializer.safeRun(StructElement::getAsDouble)));
169+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Long.class, AbstractDeserializer.safeRun(StructElement::getAsLong)));
170+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Character.class, AbstractDeserializer.safeRun(StructElement::getAsCharacter)));
171+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Byte.class, AbstractDeserializer.safeRun(StructElement::getAsByte)));
172+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, String.class, AbstractDeserializer.safeRun(StructElement::getAsString)));
173+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Boolean.class, AbstractDeserializer.safeRun(StructElement::getAsBoolean)));
174+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Short.class, AbstractDeserializer.safeRun(StructElement::getAsShort)));
175+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, BigInteger.class, AbstractDeserializer.safeRun(StructElement::getAsBigInteger)));
176+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, BigDecimal.class, AbstractDeserializer.safeRun(StructElement::getAsBigDecimal)));
177+
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Number.class, AbstractDeserializer.safeRun((number)->number.getAsNumber().castToNumber())));
175178
this.addDefaultEntry(new AbstractDeserializer<>(GSON, Void.class, AbstractDeserializer.safeRun((jsonElement)->null)));
176-
this.addDefaultEntry(new AbstractDeserializer<>(GSON, JsonObject.class, AbstractDeserializer.safeRun(JsonElement::getAsJsonObject)));
177179
consumer.accept(this);
178180
}
179181

@@ -203,15 +205,15 @@ public <T, F> AbstractDeserializer<T> map(final Class<T> tClass, final Class<F>
203205
return new AbstractDeserializer<T>(resourceLocation, tClass, jsonElement -> function.apply(DeserializerManager.this.decode(fClass, jsonElement)));
204206
}
205207

206-
public static JsonElement getFromPath(JsonObject jsonObject, String path){
208+
public static StructElement getFromPath(StructObject jsonObject, String path){
207209
int i = path.indexOf('.');
208210
if (i == -1){
209211
return jsonObject.get(path);
210212
}else {
211213
String first = path.substring(0, i-1);
212-
JsonElement element1 = jsonObject.get(first);
213-
if (element1 instanceof JsonObject){
214-
return getFromPath((JsonObject)element1, path.substring(i+1));
214+
StructElement element1 = jsonObject.get(first);
215+
if (element1.isObject()){
216+
return getFromPath(element1.getAsObject(), path.substring(i+1));
215217
}else return null;
216218
}
217219
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package rml.deserializer;
22

3-
import com.google.gson.JsonElement;
3+
import rml.deserializer.struct.std.StructElement;
44
import rml.jrx.announces.EarlyClass;
55
import rml.jrx.announces.PublicAPI;
66

@@ -13,17 +13,17 @@
1313
@EarlyClass
1414
@PublicAPI
1515
public class JsonDeserializeException extends Exception{
16-
public JsonDeserializeException(JsonElement element, Throwable throwable){
16+
public JsonDeserializeException(StructElement element, Throwable throwable){
1717
super(String.valueOf(element), throwable);
1818
}
1919

20-
public JsonDeserializeException(JsonElement element, String s){
20+
public JsonDeserializeException(StructElement element, String s){
2121
super(s + ", " + element);
2222
}
23-
public JsonDeserializeException(JsonElement element){
23+
public JsonDeserializeException(StructElement element){
2424
super(String.valueOf(element));
2525
}
26-
public JsonDeserializeException(JsonElement element, String s, Throwable throwable){
26+
public JsonDeserializeException(StructElement element, String s, Throwable throwable){
2727
super(s + ", " + element, throwable);
2828
}
2929
}

0 commit comments

Comments
 (0)