🐛 Fix multiple chained optionals not working correctly (#73)
* 🐛 Fix multiple chained optionals not working correctly There is a problem where the child arguments never forwarded their commands correctly. This will now fix itself when necessary. * 📚 Add CHANGELOG entry for change
This commit is contained in:
parent
d6cdeca1c3
commit
6c63b47e5e
3 changed files with 28 additions and 1 deletions
|
|
@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
- Fixes chained optionals not allowing the command to be executed when more than one optional is omitted
|
||||||
|
|
||||||
## [1.0.1] - 2020-10-14
|
## [1.0.1] - 2020-10-14
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -287,7 +287,20 @@ public final class CommandTree<C> {
|
||||||
if (child.getValue().hasDefaultValue()) {
|
if (child.getValue().hasDefaultValue()) {
|
||||||
commandQueue.add(child.getValue().getDefaultValue());
|
commandQueue.add(child.getValue().getDefaultValue());
|
||||||
} else if (!child.getValue().isRequired()) {
|
} else if (!child.getValue().isRequired()) {
|
||||||
return Pair.of(this.cast(child.getValue().getOwningCommand()), null);
|
if (child.getValue().getOwningCommand() == null) {
|
||||||
|
/*
|
||||||
|
* If there are multiple children with different owning commands then it's ambiguous and
|
||||||
|
* not allowed, therefore we're able to pick any child command, as long as we can find it
|
||||||
|
*/
|
||||||
|
Node<CommandArgument<C, ?>> node = child;
|
||||||
|
while (!node.isLeaf()) {
|
||||||
|
node = node.getChildren().get(0);
|
||||||
|
if (node.getValue() != null && node.getValue().getOwningCommand() != null) {
|
||||||
|
child.getValue().setOwningCommand(node.getValue().getOwningCommand());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Pair.of(child.getValue().getOwningCommand(), null);
|
||||||
} else if (child.isLeaf()) {
|
} else if (child.isLeaf()) {
|
||||||
if (root.getValue() != null && root.getValue().getOwningCommand() != null) {
|
if (root.getValue() != null && root.getValue().getOwningCommand() != null) {
|
||||||
final Command<C> command = root.getValue().getOwningCommand();
|
final Command<C> command = root.getValue().getOwningCommand();
|
||||||
|
|
|
||||||
|
|
@ -143,6 +143,13 @@ class CommandTreeTest {
|
||||||
.addPreprocessor(RegexPreprocessor.of("[A-Za-z]{3,5}"))
|
.addPreprocessor(RegexPreprocessor.of("[A-Za-z]{3,5}"))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/* Build command for testing multiple optionals */
|
||||||
|
manager.command(
|
||||||
|
manager.commandBuilder("optionals")
|
||||||
|
.argument(StringArgument.optional("opt1"))
|
||||||
|
.argument(StringArgument.optional("opt2"))
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -301,6 +308,11 @@ class CommandTreeTest {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testOptionals() {
|
||||||
|
manager.executeCommand(new TestCommandSender(), "optionals").join();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static final class SpecificCommandSender extends TestCommandSender {
|
public static final class SpecificCommandSender extends TestCommandSender {
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue