package net.minestom.server.command.builder.arguments; import net.minestom.server.command.CommandSender; import net.minestom.server.command.builder.exception.ArgumentSyntaxException; import org.jetbrains.annotations.NotNull; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.function.UnaryOperator; @SuppressWarnings("rawtypes") public class ArgumentEnum extends Argument { public final static int NOT_ENUM_VALUE_ERROR = 1; private final Class enumClass; private final E[] values; private Format format = Format.DEFAULT; public ArgumentEnum(@NotNull String id, Class enumClass) { super(id); this.enumClass = enumClass; this.values = enumClass.getEnumConstants(); } public ArgumentEnum setFormat(@NotNull Format format) { this.format = format; return this; } @NotNull @Override public E parse(@NotNull CommandSender sender, @NotNull String input) throws ArgumentSyntaxException { for (E value : this.values) { if (this.format.formatter.apply(value.name()).equals(input)) { return value; } } throw new ArgumentSyntaxException("Not a " + this.enumClass.getSimpleName() + " value", input, NOT_ENUM_VALUE_ERROR); } @Override public String parser() { return null; } public List entries() { return Arrays.stream(values).map(x -> format.formatter.apply(x.name())).toList(); } public enum Format { DEFAULT(name -> name), LOWER_CASED(name -> name.toLowerCase(Locale.ROOT)), UPPER_CASED(name -> name.toUpperCase(Locale.ROOT)); private final UnaryOperator formatter; Format(@NotNull UnaryOperator formatter) { this.formatter = formatter; } } @Override public String toString() { return String.format("Enum<%s>", getId()); } }