-
-
Notifications
You must be signed in to change notification settings - Fork 382
/
Copy pathEnumClassInfo.java
85 lines (76 loc) · 3.28 KB
/
EnumClassInfo.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
77
78
79
80
81
82
83
84
85
package ch.njol.skript.classes;
import ch.njol.skript.expressions.base.EventValueExpression;
import ch.njol.skript.lang.DefaultExpression;
import ch.njol.skript.lang.ParseContext;
import ch.njol.skript.util.EnumUtils;
import ch.njol.skript.util.StringMode;
import ch.njol.util.coll.iterator.ArrayIterator;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.skriptlang.skript.lang.comparator.Comparators;
import org.skriptlang.skript.lang.comparator.Relation;
/**
* This class can be used for an easier writing of ClassInfos that are enums,
* it registers a language node with usage, a serializer, default expression and a parser.
* Making it easier to register enum ClassInfos.
* @param <T> The enum class.
*/
public class EnumClassInfo<T extends Enum<T>> extends ClassInfo<T> {
/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode) {
this(enumClass, codeName, languageNode, new EventValueExpression<>(enumClass), true);
}
/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
* @param registerComparator Whether a default comparator should be registered for this enum's classinfo
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, boolean registerComparator) {
this(enumClass, codeName, languageNode, new EventValueExpression<>(enumClass), registerComparator);
}
/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
* @param defaultExpression The default expression of the type
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, DefaultExpression<T> defaultExpression) {
this(enumClass, codeName, languageNode, defaultExpression, true);
}
/**
* @param enumClass The class
* @param codeName The name used in patterns
* @param languageNode The language node of the type
* @param defaultExpression The default expression of the type
* @param registerComparator Whether a default comparator should be registered for this enum's classinfo
*/
public EnumClassInfo(Class<T> enumClass, String codeName, String languageNode, DefaultExpression<T> defaultExpression, boolean registerComparator) {
super(enumClass, codeName);
EnumUtils<T> enumUtils = new EnumUtils<>(enumClass, languageNode);
usage(enumUtils.getAllNames())
.serializer(new EnumSerializer<>(enumClass))
.defaultExpression(defaultExpression)
.supplier(() -> new ArrayIterator<>(enumClass.getEnumConstants()))
.parser(new Parser<T>() {
@Override
public @Nullable T parse(String input, ParseContext context) {
return enumUtils.parse(input);
}
@Override
public @NotNull String toString(T constant, int flags) {
return enumUtils.toString(constant, StringMode.MESSAGE);
}
@Override
public @NotNull String toVariableNameString(T constant) {
return enumUtils.toString(constant, StringMode.VARIABLE_NAME);
}
});
if (registerComparator)
Comparators.registerComparator(enumClass, enumClass, (o1, o2) -> Relation.get(o1.ordinal() - o2.ordinal()));
}
}