Add command proxies
This commit is contained in:
parent
d3ed876df6
commit
c980adac3b
6 changed files with 126 additions and 4 deletions
|
|
@ -211,7 +211,16 @@ public final class AnnotationParser<C> {
|
|||
} catch (final Exception e) {
|
||||
throw new RuntimeException("Failed to construct command execution handler", e);
|
||||
}
|
||||
commands.add(builder.build());
|
||||
final Command<C> builtCommand = builder.build();
|
||||
commands.add(builtCommand);
|
||||
/* Check if we need to construct a proxy */
|
||||
if (method.isAnnotationPresent(ProxiedBy.class)) {
|
||||
final String proxy = method.getAnnotation(ProxiedBy.class).value();
|
||||
if (proxy.contains(" ")) {
|
||||
throw new IllegalArgumentException("@ProxiedBy proxies may only contain single literals");
|
||||
}
|
||||
manager.command(manager.commandBuilder(proxy, builtCommand.getCommandMeta()).proxies(builtCommand).build());
|
||||
}
|
||||
}
|
||||
return commands;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,47 @@
|
|||
//
|
||||
// MIT License
|
||||
//
|
||||
// Copyright (c) 2020 Alexander Söderberg
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
// SOFTWARE.
|
||||
//
|
||||
package com.intellectualsites.commands.annotations;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
/**
|
||||
* Creates a command proxy for the command. This is similar to
|
||||
* {@link com.intellectualsites.commands.Command.Builder#proxies(com.intellectualsites.commands.Command)}.
|
||||
*/
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface ProxiedBy {
|
||||
|
||||
/**
|
||||
* Syntax of the proxying command
|
||||
*
|
||||
* @return Proxy syntax
|
||||
*/
|
||||
@Nonnull String value();
|
||||
|
||||
}
|
||||
|
|
@ -54,13 +54,15 @@ class AnnotationParserTest {
|
|||
void testMethodConstruction() {
|
||||
final Collection<Command<TestCommandSender>> commands = annotationParser.parse(this);
|
||||
Assertions.assertFalse(commands.isEmpty());
|
||||
manager.executeCommand(new TestCommandSender(), "test 10").join();
|
||||
manager.executeCommand(new TestCommandSender(), "t 10 o").join();
|
||||
manager.executeCommand(new TestCommandSender(), "test literal 10").join();
|
||||
manager.executeCommand(new TestCommandSender(), "t literal 10 o").join();
|
||||
manager.executeCommand(new TestCommandSender(), "proxycommand 10").join();
|
||||
Assertions.assertThrows(CompletionException.class, () ->
|
||||
manager.executeCommand(new TestCommandSender(), "test 101").join());
|
||||
}
|
||||
|
||||
@CommandMethod("test|t <int> [string]")
|
||||
@ProxiedBy("proxycommand")
|
||||
@CommandMethod("test|t literal <int> [string]")
|
||||
public void testCommand(@Nonnull final TestCommandSender sender,
|
||||
@Argument("int") @Range(max = "100") final int argument,
|
||||
@Nonnull @Argument(value = "string", defaultValue = "potato", parserName = "potato")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue