mirror of
https://github.com/aikar/commands.git
synced 2026-05-31 06:11:55 +00:00
Allow multiple optional type resolvers on the tail-end of commands (#35)
This commit is contained in:
@@ -95,17 +95,11 @@ public class RegisteredCommand {
|
||||
resolvers[i] = resolver;
|
||||
|
||||
if (!CommandSender.class.isAssignableFrom(parameter.getType())) {
|
||||
if (resolver instanceof SenderAwareContextResolver || parameter.getAnnotation(Optional.class) != null
|
||||
|| parameter.getAnnotation(Default.class) != null) {
|
||||
if (isOptionalResolver(resolver, parameter)) {
|
||||
optionalResolvers++;
|
||||
} else {
|
||||
nonSenderAwareResolvers++;
|
||||
}
|
||||
if (parameter.getAnnotation(Default.class) != null ||
|
||||
parameter.getAnnotation(Optional.class) != null ||
|
||||
resolver instanceof SenderAwareContextResolver) {
|
||||
syntaxB.append('[').append(parameter.getName()).append("] ");
|
||||
} else {
|
||||
nonSenderAwareResolvers++;
|
||||
syntaxB.append('<').append(parameter.getName()).append("> ");
|
||||
}
|
||||
}
|
||||
@@ -124,6 +118,12 @@ public class RegisteredCommand {
|
||||
this.optionalResolvers = optionalResolvers;
|
||||
}
|
||||
|
||||
static boolean isOptionalResolver(ContextResolver<?> resolver, Parameter parameter) {
|
||||
return resolver instanceof SenderAwareContextResolver
|
||||
|| parameter.getAnnotation(Optional.class) != null
|
||||
|| parameter.getAnnotation(Default.class) != null;
|
||||
}
|
||||
|
||||
void invoke(CommandSender sender, List<String> args) {
|
||||
if (!scope.canExecute(sender, this)) {
|
||||
return;
|
||||
@@ -164,19 +164,24 @@ public class RegisteredCommand {
|
||||
args = Lists.newArrayList(args);
|
||||
String[] origArgs = args.toArray(new String[args.size()]);
|
||||
Map<String, Object> passedArgs = Maps.newLinkedHashMap();
|
||||
int remainingRequired = nonSenderAwareResolvers;
|
||||
for (int i = 0; i < parameters.length && i < argLimit; i++) {
|
||||
boolean isLast = i == parameters.length - 1;
|
||||
boolean allowOptional = remainingRequired == 0;
|
||||
final Parameter parameter = parameters[i];
|
||||
final String parameterName = parameter.getName();
|
||||
final Class<?> type = parameter.getType();
|
||||
final ContextResolver<?> resolver = resolvers[i];
|
||||
CommandExecutionContext context = new CommandExecutionContext(this, parameter, sender, args, i, passedArgs);
|
||||
if (!isOptionalResolver(resolver, parameter)) {
|
||||
remainingRequired--;
|
||||
}
|
||||
if (args.isEmpty() && !(isLast && type == String[].class)) {
|
||||
Default def = parameter.getAnnotation(Default.class);
|
||||
Optional opt = parameter.getAnnotation(Optional.class);
|
||||
if (isLast && def != null) {
|
||||
if (allowOptional && def != null) {
|
||||
args.add(scope.manager.getCommandReplacements().replace(def.value()));
|
||||
} else if (isLast && opt != null) {
|
||||
} else if (allowOptional && opt != null) {
|
||||
passedArgs.put(parameterName, resolver instanceof SenderAwareContextResolver ? resolver.getContext(context) : null);
|
||||
//noinspection UnnecessaryContinue
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user