12
0

Finish CommandNode

Dieser Commit ist enthalten in:
yoyosource 2021-07-09 14:31:24 +02:00
Ursprung 5240ca3bf4
Commit deb7f71090

Datei anzeigen

@ -21,21 +21,30 @@ package de.steamwar.command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import java.lang.reflect.Array;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors; import java.util.stream.Collectors;
class CommandNode { class CommandNode {
private final SWCommand swCommand;
private final TypeMapper<?> typeMapper; private final TypeMapper<?> typeMapper;
private boolean varArg = false; private boolean varArg = false;
private List<CommandNode> commandNodeList = new ArrayList<>(); private List<CommandNode> commandNodeList = new ArrayList<>();
private Method executor; private Method executor;
CommandNode(TypeMapper<?> typeMapper) { private Predicate<CommandSender> commandSenderPredicate;
private Function<CommandSender, Object> commandSenderObjectFunction;
CommandNode(SWCommand swCommand, TypeMapper<?> typeMapper) {
this.swCommand = swCommand;
this.typeMapper = typeMapper; this.typeMapper = typeMapper;
} }
@ -44,8 +53,13 @@ class CommandNode {
this.varArg = false; this.varArg = false;
} }
public void setExecutor(Method method) { public void setExecutor(Method executor) {
if (this.executor != null) return;
this.executor = executor; this.executor = executor;
Parameter parameter = executor.getParameters()[0];
commandSenderPredicate = parameter.getType()::isInstance;
commandSenderObjectFunction = parameter.getType()::cast;
} }
public void setVarArg(boolean varArg) { public void setVarArg(boolean varArg) {
@ -77,17 +91,48 @@ class CommandNode {
} }
} }
public boolean execute(CommandSender commandSender, int index, String[] args) { public boolean execute(CommandSender commandSender, int index, String[] args, List<Object> mappedObjects) {
if (varArg) { try {
for (int i = index; i < args.length; i++) { Object o;
String[] previousArgs = Arrays.copyOf(args, i); if (varArg) {
typeMapper.map(commandSender, previousArgs, args[i]); o = Array.newInstance(Object.class, args.length - index);
for (int i = 0; i < Array.getLength(o); i++) {
Object current = typeMapper.map(commandSender, Arrays.copyOf(args, index + i), args[index + i]);
if (current == null) return false;
Array.set(o, i, current);
}
} else {
o = typeMapper.map(commandSender, Arrays.copyOf(args, index), args[index]);
if (o == null) return false;
} }
} else { mappedObjects.add(o);
} catch (Exception e) {
return false;
} }
// if (args.length)
return false; if (index == args.length - 1) {
if (executor == null) {
return false;
}
if (!commandSenderPredicate.test(commandSender)) {
return false;
}
List<Object> finalMappedObjects = new ArrayList<>(mappedObjects);
finalMappedObjects.add(0, commandSenderObjectFunction.apply(commandSender));
Object[] objects = finalMappedObjects.toArray(new Object[0]);
try {
executor.invoke(swCommand, objects);
return true;
} catch (Exception e) {
throw new SecurityException(e.getMessage(), e);
}
}
return commandNodeList.stream()
.map(commandNode -> commandNode.execute(commandSender, index + 1, args, new ArrayList<>(mappedObjects)))
.findFirst().orElse(false);
} }
} }