Skip to content

Commit 23c1028

Browse files
made parsing enum argument types more efficient if the enum constants are all in uppercase
1 parent 40b73e6 commit 23c1028

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

src/main/java/com/datasiqn/commandcore/argument/type/ArgumentType.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ class EnumArgumentType<T extends Enum<T>> implements SimpleArgumentType<T> {
168168
private final Class<T> enumClass;
169169
private final String enumName;
170170
private final List<String> tabCompletes;
171+
private final boolean uppercaseValues;
171172

172173
/**
173174
* Creates a new {@code ArgumentType}
@@ -185,6 +186,17 @@ public EnumArgumentType(@NotNull Class<T> enumClass, @NotNull String enumName) {
185186
this.enumClass = enumClass;
186187
this.enumName = enumName;
187188
this.tabCompletes = Arrays.stream(enumClass.getEnumConstants()).map(val -> val.name().toLowerCase(Locale.ROOT)).collect(Collectors.toList());
189+
190+
for (T enumConstant : enumClass.getEnumConstants()) {
191+
for (char letter : enumConstant.name().toCharArray()) {
192+
if (Character.isLetter(letter) && !Character.isUpperCase(letter)) {
193+
this.uppercaseValues = false;
194+
Bukkit.getLogger().warning("[CommandCore] Enum " + enumName + " includes values that aren't in uppercase!");
195+
return;
196+
}
197+
}
198+
}
199+
this.uppercaseValues = true;
188200
}
189201

190202
@Override
@@ -194,7 +206,7 @@ public EnumArgumentType(@NotNull Class<T> enumClass, @NotNull String enumName) {
194206

195207
@Override
196208
public @NotNull Result<T, None> parseWord(String word) {
197-
return Result.resolve(() -> EnumUtils.findEnumInsensitiveCase(enumClass, word));
209+
return Result.resolve(() -> uppercaseValues ? Enum.valueOf(enumClass, word.toUpperCase()) : EnumUtils.findEnumInsensitiveCase(enumClass, word));
198210
}
199211

200212
@Override
@@ -207,10 +219,8 @@ public EnumArgumentType(@NotNull Class<T> enumClass, @NotNull String enumName) {
207219
* Represents a custom {@code ArgumentType} that parses to a filtered enum
208220
* @param <T> The type of the enum
209221
*/
210-
class FilteredEnumArgumentType<T extends Enum<T>> implements SimpleArgumentType<T> {
222+
class FilteredEnumArgumentType<T extends Enum<T>> extends EnumArgumentType<T> {
211223
private final Predicate<T> filter;
212-
private final String enumName;
213-
private final Class<T> enumClass;
214224
private final List<String> tabCompletes;
215225

216226
/**
@@ -220,21 +230,14 @@ class FilteredEnumArgumentType<T extends Enum<T>> implements SimpleArgumentType<
220230
* @param enumName The name of the enum. This is used when displaying an error message (Invalid {{@code enumName}} '{val}'
221231
*/
222232
public FilteredEnumArgumentType(@NotNull Class<T> enumClass, Predicate<T> filter, String enumName) {
223-
this.enumClass = enumClass;
233+
super(enumClass, enumName);
224234
this.filter = filter;
225-
this.enumName = enumName;
226235
this.tabCompletes = Arrays.stream(enumClass.getEnumConstants()).filter(filter).map(val -> val.name().toLowerCase(Locale.ROOT)).collect(Collectors.toList());
227236
}
228237

229-
@Override
230-
public @NotNull String getTypeName() {
231-
return enumName;
232-
}
233-
234238
@Override
235239
public @NotNull Result<T, None> parseWord(String word) {
236-
return Result.resolve(() -> EnumUtils.findEnumInsensitiveCase(enumClass, word))
237-
.andThen(val -> filter.test(val) ? Result.ok(val) : Result.error());
240+
return super.parseWord(word).andThen(val -> filter.test(val) ? Result.ok(val) : Result.error());
238241
}
239242

240243
@Override

0 commit comments

Comments
 (0)