/
InvertedJsonPredicate.java
76 lines (64 loc) · 2.59 KB
/
InvertedJsonPredicate.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package slimeknights.mantle.data.predicate;
import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor;
import net.minecraft.network.FriendlyByteBuf;
import slimeknights.mantle.data.loadable.record.RecordLoadable;
import slimeknights.mantle.data.registry.DirectRegistryField;
import slimeknights.mantle.data.registry.GenericLoaderRegistry;
import slimeknights.mantle.data.registry.GenericLoaderRegistry.IGenericLoader;
/**
* Predicate that inverts the condition.
* Generally, this class should not be constructed directly, use {@link IJsonPredicate#inverted()} instead as it will simplify inverted forms.
*/
@RequiredArgsConstructor
public class InvertedJsonPredicate<I> implements IJsonPredicate<I> {
private final Loader<I> loader;
private final IJsonPredicate<I> base;
@Override
public boolean matches(I input) {
return !base.matches(input);
}
@Override
public IGenericLoader<? extends IJsonPredicate<I>> getLoader() {
return loader;
}
@Override
public IJsonPredicate<I> inverted() {
return base;
}
/** Loader for an inverted JSON predicate */
@RequiredArgsConstructor
public static class Loader<I> implements IGenericLoader<InvertedJsonPredicate<I>>, RecordLoadable<InvertedJsonPredicate<I>> {
/** Loader for predicates of this type */
private final GenericLoaderRegistry<IJsonPredicate<I>> loader;
/** If true, will support the nested method for predicates as a fallback, will still prefer the non-nested method for serializing */
private final boolean allowNested;
public Loader(GenericLoaderRegistry<IJsonPredicate<I>> loader) {
this(loader, true);
}
/** Creates a new instance of an inverted predicate */
public InvertedJsonPredicate<I> create(IJsonPredicate<I> predicate) {
return new InvertedJsonPredicate<>(this, predicate);
}
@Override
public InvertedJsonPredicate<I> deserialize(JsonObject json) {
if (allowNested && json.has("predicate")) {
return create(loader.getAndDeserialize(json, "predicate"));
}
DirectRegistryField.mapType(json, "inverted_type");
return create(loader.deserialize(json));
}
@Override
public InvertedJsonPredicate<I> fromNetwork(FriendlyByteBuf buffer) {
return create(loader.fromNetwork(buffer));
}
@Override
public void serialize(InvertedJsonPredicate<I> object, JsonObject json) {
DirectRegistryField.serializeInto(json, "inverted_type", loader, object.base);
}
@Override
public void toNetwork(InvertedJsonPredicate<I> object, FriendlyByteBuf buffer) {
loader.toNetwork(object.base, buffer);
}
}
}