diff --git a/src/de/steamwar/command/AbstractSWCommand.java b/src/de/steamwar/command/AbstractSWCommand.java index b8dc078..06bb9f2 100644 --- a/src/de/steamwar/command/AbstractSWCommand.java +++ b/src/de/steamwar/command/AbstractSWCommand.java @@ -40,6 +40,7 @@ public abstract class AbstractSWCommand { private boolean initialized = false; protected final List> commandList = new ArrayList<>(); + protected final List> helpCommandList = new ArrayList<>(); private final Map> localTypeMapper = new HashMap<>(); private final Map> localValidators = new HashMap<>(); @@ -83,7 +84,9 @@ public abstract class AbstractSWCommand { initialize(); List errors = new ArrayList<>(); try { - if (!commandList.stream().anyMatch(s -> s.invoke(errors::add, sender, alias, args))) { + if (commandList.stream().noneMatch(s -> s.invoke(errors::add, sender, alias, args))) { + errors.forEach(Runnable::run); + } else if (helpCommandList.stream().noneMatch(s -> s.invoke(errors::add, sender, alias, args))) { errors.forEach(Runnable::run); } } catch (CommandFrameworkException e) { @@ -158,6 +161,14 @@ public abstract class AbstractSWCommand { } Collections.sort(commandList); + commandList.removeIf(subCommand -> { + if (subCommand.isHelp) { + helpCommandList.add(subCommand); + return true; + } else { + return false; + } + }); initialized = true; } diff --git a/src/de/steamwar/command/CommandPart.java b/src/de/steamwar/command/CommandPart.java index 5eb264c..02991b4 100644 --- a/src/de/steamwar/command/CommandPart.java +++ b/src/de/steamwar/command/CommandPart.java @@ -83,6 +83,20 @@ class CommandPart { this.next = next; } + public boolean isHelp() { + if (next == null) { + if (varArgType == null) { + return false; + } + if (varArgType != String.class) { + return false; + } + return typeMapper == SWCommandUtils.STRING_MAPPER; + } else { + return next.isHelp(); + } + } + public void generateArgumentArray(Consumer errors, List current, T sender, String[] args, int startIndex) { if (varArgType != null) { Object array = Array.newInstance(varArgType, args.length - startIndex); diff --git a/src/de/steamwar/command/SWCommandUtils.java b/src/de/steamwar/command/SWCommandUtils.java index c06d584..ed16eab 100644 --- a/src/de/steamwar/command/SWCommandUtils.java +++ b/src/de/steamwar/command/SWCommandUtils.java @@ -51,6 +51,8 @@ public class SWCommandUtils { } }; + static final AbstractTypeMapper STRING_MAPPER = createMapper(s -> s, Collections::singletonList); + static { addMapper(boolean.class, Boolean.class, createMapper(s -> { if (s.equalsIgnoreCase("true")) return true; @@ -61,7 +63,7 @@ public class SWCommandUtils { addMapper(double.class, Double.class, createMapper(numberMapper(Double::parseDouble), numberCompleter(Double::parseDouble, true))); addMapper(int.class, Integer.class, createMapper(numberMapper(Integer::parseInt), numberCompleter(Integer::parseInt, false))); addMapper(long.class, Long.class, createMapper(numberMapper(Long::parseLong), numberCompleter(Long::parseLong, false))); - MAPPER_FUNCTIONS.put(String.class.getTypeName(), createMapper(s -> s, Collections::singletonList)); + MAPPER_FUNCTIONS.put(String.class.getTypeName(), STRING_MAPPER); } public static , K, V> void init(SWTypeMapperCreator swTypeMapperCreator) { diff --git a/src/de/steamwar/command/SubCommand.java b/src/de/steamwar/command/SubCommand.java index 6b8828e..368a817 100644 --- a/src/de/steamwar/command/SubCommand.java +++ b/src/de/steamwar/command/SubCommand.java @@ -47,6 +47,8 @@ public class SubCommand implements Comparable> { private CommandPart commandPart; + boolean isHelp = false; + SubCommand(AbstractSWCommand abstractSWCommand, Method method, String[] subCommand, Map> localTypeMapper, Map> localValidator, String[] description, boolean noTabComplete) { this.abstractSWCommand = abstractSWCommand; this.method = method; @@ -70,6 +72,7 @@ public class SubCommand implements Comparable> { } commandPart = generateCommandPart(abstractSWCommand, subCommand, parameters, localTypeMapper, localValidator); + if (commandPart != null) isHelp = commandPart.isHelp(); senderPredicate = t -> parameters[0].getType().isAssignableFrom(t.getClass()); senderFunction = t -> parameters[0].getType().cast(t); diff --git a/testsrc/de/steamwar/command/SubCMDSortingCommand.java b/testsrc/de/steamwar/command/SubCMDSortingCommand.java index 0f4e151..8b28760 100644 --- a/testsrc/de/steamwar/command/SubCMDSortingCommand.java +++ b/testsrc/de/steamwar/command/SubCMDSortingCommand.java @@ -21,6 +21,9 @@ package de.steamwar.command; import de.steamwar.command.dto.ExecutionIdentifier; import de.steamwar.command.dto.TestSWCommand; +import de.steamwar.command.dto.TestTypeMapper; + +import java.util.Collections; public class SubCMDSortingCommand extends TestSWCommand { @@ -47,4 +50,9 @@ public class SubCMDSortingCommand extends TestSWCommand { public void test(String s, String... args) { throw new ExecutionIdentifier("Command with n parameters"); } + + @ClassMapper(value = String.class, local = true) + public AbstractTypeMapper stringMapper() { + return SWCommandUtils.createMapper(s -> s, Collections::singletonList); + } }