Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@

<groupId>dev.hugog.minecraft</groupId>
<artifactId>dev-command</artifactId>
<version>0.0.6</version>
<version>0.0.7</version>

<properties>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Expand All @@ -26,7 +26,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.20.6-R0.1-SNAPSHOT</version>
<version>1.16.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>

Expand Down Expand Up @@ -107,8 +107,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>21</source>
<target>21</target>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,31 @@
package dev.hugog.minecraft.dev_command.arguments;

import dev.hugog.minecraft.dev_command.arguments.parsers.CommandArgumentParser;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

public record CommandArgument(String name, String description, int position,
Class<? extends CommandArgumentParser<?>> validator,
boolean optional
) { }
import java.util.Objects;

@Getter
@RequiredArgsConstructor
@Accessors(fluent = true)
public class CommandArgument {
private final String name;
private final String description;
private final int position;
private final Class<? extends CommandArgumentParser<?>> validator;
private final boolean optional;

@Override
public boolean equals(Object o) {
if (o == null || getClass() != o.getClass()) return false;
CommandArgument that = (CommandArgument) o;
return position == that.position && optional == that.optional && Objects.equals(name, that.name) && Objects.equals(description, that.description) && Objects.equals(validator, that.validator);
}

@Override
public int hashCode() {
return Objects.hash(name, description, position, validator, optional);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.bukkit.entity.Player;

import java.util.Arrays;
import java.util.Optional;

@Generated
@Getter
Expand All @@ -26,7 +27,7 @@ public abstract class BukkitDevCommand implements IDevCommand {
private final CommandSender commandSender;
private final String[] args;

public BukkitDevCommand(BukkitCommandData commandData, CommandSender commandSender, String[] args) {
protected BukkitDevCommand(BukkitCommandData commandData, CommandSender commandSender, String[] args) {
this.commandData = commandData;
this.commandSender = commandSender;
this.args = args;
Expand Down Expand Up @@ -101,6 +102,19 @@ public ICommandArgumentParser<?> getArgumentParser(int argumentPosition) {
.orElseThrow();
}

@Override
public Optional<ICommandArgumentParser<?>> getOptionalArgumentParser(int argumentPosition) {
if (args.length <= argumentPosition) {
return Optional.empty();
}

return Optional.of(Arrays.stream(commandData.getArguments())
.filter(commandArgument -> commandArgument.position() == argumentPosition)
.findFirst()
.map(commandArgument -> new ArgumentParserFactory(args[argumentPosition]).generate(commandArgument.validator()))
.orElseThrow());
}

@Override
public boolean performAutoValidation(IAutoValidationConfiguration configuration) {
if (commandData.getAutoValidationData() == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,39 @@
import dev.hugog.minecraft.dev_command.validation.IAutoValidationConfiguration;

import java.util.List;
import java.util.Optional;

public interface IDevCommand {

void execute();

List<String> onTabComplete(String[] args);

/**
* Get Argument Parser for a mandatory argument at the given position.
*
* @param argumentPosition the position of the argument
* @return the argument parser
* @throws IllegalArgumentException if the argument is not present
*/
ICommandArgumentParser<?> getArgumentParser(int argumentPosition);

/**
* Get Argument Parser for an optional argument at the given position.
*
* @param argumentPosition the position of the argument
* @return an Optional containing the argument parser if the argument exists, or an empty Optional if not exists
*/
Optional<ICommandArgumentParser<?>> getOptionalArgumentParser(int argumentPosition);

boolean hasPermissionToExecuteCommand();

boolean hasValidArgs();

boolean canSenderExecuteCommand();

boolean performAutoValidation(IAutoValidationConfiguration configuration);

<T> T getDependency(Class<T> dependencyClass);

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.bukkit.command.CommandSender;

import java.util.*;
import java.util.stream.Collectors;

@Log4j2
public class CommandHandler {
Expand Down Expand Up @@ -74,7 +75,8 @@ public List<String> executeTabComplete(Integration integration, CommandSender co
IDevCommand command = commandFactory.generate((AbstractCommandData) lastArgumentNode.getExtraData());
return command.onTabComplete(commandArguments);
} else { // The tab completion should be handled by the DevCommand using info. about the command tree
return lastArgumentNode.getChildren().stream().map(Tree.Node::getData).toList();
return lastArgumentNode.getChildren().stream().map(Tree.Node::getData)
.collect(Collectors.toUnmodifiableList());
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
package dev.hugog.minecraft.dev_command.validation;

public record AutoValidationData(
boolean validatePermission,
boolean validateArguments,
boolean validateSender
) { }
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

@Getter
@RequiredArgsConstructor
@Accessors(fluent = true)
public class AutoValidationData {
private final boolean validatePermission;
private final boolean validateArguments;
private final boolean validateSender;
}