separate reading from parsing
This commit is contained in:
parent
36a13443db
commit
aae7a160ac
22 changed files with 137 additions and 78 deletions
|
|
@ -1,6 +1,6 @@
|
|||
package de.kentoj.scrow.bukkit.services.command;
|
||||
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.node.RootLiteral;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.literal.RootLiteral;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public interface CommandManager {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
package de.kentoj.scrow.bukkit.services.command.cmds2;
|
||||
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
public interface ArgumentData<T> {
|
||||
|
||||
T getValue();
|
||||
|
||||
CommandArgument<T> getArgument();
|
||||
|
||||
/**
|
||||
* @return null if the default value for the type was used
|
||||
*/
|
||||
@Nullable String getRawValue();
|
||||
}
|
||||
|
|
@ -17,9 +17,20 @@ public interface CommandContext {
|
|||
* @return Object that is parsed from the raw argument
|
||||
* @throws CommandInvocationException if no value given and no default value supplied
|
||||
*/
|
||||
<T> T getArg(String name);
|
||||
<T> ArgumentData<T> getArgData(String name);
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default <T> T getArgData(CommandArgument<T> arg) {
|
||||
return (T) getArgData(arg.getName());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default <T> T getArg(String name) {
|
||||
return (T) getArgData(name).getValue();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
default <T> T getArg(CommandArgument<T> arg) {
|
||||
return getArg(arg.getName());
|
||||
return (T) getArgData(arg.getName()).getValue();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package de.kentoj.scrow.bukkit.services.command.cmds2;
|
||||
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.node.Literal;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.node.RootLiteral;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.literal.Literal;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.literal.RootLiteral;
|
||||
import de.kentoj.scrow.bukkit.services.command.type.ArgumentType;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
package de.kentoj.scrow.bukkit.services.command.cmds2;
|
||||
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.node.Literal;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.node.RootLiteral;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.literal.Literal;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.literal.RootLiteral;
|
||||
import de.kentoj.scrow.bukkit.services.command.type.ArgumentType;
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package de.kentoj.scrow.bukkit.services.command.cmds2.node;
|
||||
package de.kentoj.scrow.bukkit.services.command.cmds2.literal;
|
||||
|
||||
import de.kentoj.scrow.bukkit.services.command.CommandExecutor;
|
||||
import de.kentoj.scrow.bukkit.services.command.cmds2.CommandArgument;
|
||||
|
|
@ -6,6 +6,7 @@ import org.bukkit.permissions.Permission;
|
|||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public interface Literal {
|
||||
|
||||
|
|
@ -23,6 +24,8 @@ public interface Literal {
|
|||
|
||||
@Nullable Literal getLiteral(String rawArg);
|
||||
|
||||
Set<Literal> getLiterals();
|
||||
|
||||
boolean hasLiteral();
|
||||
|
||||
void setExecutor(@Nullable CommandExecutor executor);
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package de.kentoj.scrow.bukkit.services.command.cmds2.node;
|
||||
package de.kentoj.scrow.bukkit.services.command.cmds2.literal;
|
||||
|
||||
import java.util.Set;
|
||||
|
||||
|
|
@ -8,12 +8,14 @@ import java.util.Set;
|
|||
|
||||
public interface ArgumentType<T> {
|
||||
|
||||
T parseInput(String rawInput);
|
||||
|
||||
String readRawInput(ArgumentReader reader);
|
||||
|
||||
/**
|
||||
* @throws CommandInvocationException if the given value may not be used
|
||||
*/
|
||||
void checkValue(CommandContext ctx, T value) throws CommandInvocationException;
|
||||
|
||||
Set<String> getDefaultSuggestions(CommandContext ctx);
|
||||
|
||||
T parseInput(ArgumentReader reader);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,20 @@ public class NumberArgumentType {
|
|||
Preconditions.checkArgument(min < max, "min is greater than max");
|
||||
|
||||
return new ArgumentType<>() {
|
||||
@Override
|
||||
public Integer parseInput(String rawInput) {
|
||||
try {
|
||||
return Integer.parseInt(rawInput);
|
||||
} catch (NumberFormatException ex) {
|
||||
throw new CommandInvocationException("Invalid number -- " + rawInput);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readRawInput(ArgumentReader reader) {
|
||||
return reader.readWord();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkValue(CommandContext ctx, Integer value) throws CommandInvocationException {
|
||||
if (value < min) throw new CommandInvocationException("Value too small -- " + value);
|
||||
|
|
@ -28,16 +42,6 @@ public class NumberArgumentType {
|
|||
public Set<String> getDefaultSuggestions(CommandContext ctx) {
|
||||
return Set.of();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer parseInput(ArgumentReader reader) {
|
||||
final var str = reader.readWord();
|
||||
try {
|
||||
return Integer.parseInt(str);
|
||||
} catch (NumberFormatException ex) {
|
||||
throw new CommandInvocationException("Invalid number -- " + str);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,39 +19,43 @@ import java.util.stream.Collectors;
|
|||
public class PlayerArgumentType {
|
||||
|
||||
private static final ArgumentType<Player> player = new ArgumentType<>() {
|
||||
|
||||
@Override
|
||||
public Player parseInput(String rawInput) {
|
||||
if (rawInput.length() == 36) {
|
||||
var uuid = UUID.fromString(rawInput);
|
||||
return Bukkit.getPlayer(uuid);
|
||||
} else {
|
||||
return Bukkit.getPlayerExact(rawInput);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readRawInput(ArgumentReader reader) {
|
||||
return reader.readWord();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void checkValue(CommandContext ctx, Player value) throws CommandInvocationException {
|
||||
if (value == null)
|
||||
throw new CommandInvocationException("Player is not online");
|
||||
if (value == null) throw new CommandInvocationException("Player is not online");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getDefaultSuggestions(CommandContext ctx) {
|
||||
return Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Player parseInput(ArgumentReader reader) {
|
||||
final var word = reader.readWord();
|
||||
if (word.length() == 36) {
|
||||
var uuid = UUID.fromString(word);
|
||||
return Bukkit.getPlayer(uuid);
|
||||
} else {
|
||||
return Bukkit.getPlayerExact(word);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
private static final ArgumentType<OfflinePlayer> offlinePlayer = new ArgumentType<>() {
|
||||
|
||||
@Override
|
||||
public OfflinePlayer parseInput(ArgumentReader reader) {
|
||||
final var str = reader.readWord();
|
||||
public OfflinePlayer parseInput(String rawInput) {
|
||||
OfflinePlayer player;
|
||||
|
||||
player = Bukkit.getPlayerExact(str);
|
||||
player = Bukkit.getPlayerExact(rawInput);
|
||||
if (player == null) {
|
||||
try {
|
||||
player = Bukkit.getOfflinePlayer(UUID.fromString(str));
|
||||
player = Bukkit.getOfflinePlayer(UUID.fromString(rawInput));
|
||||
} catch (IllegalArgumentException ex) {
|
||||
throw new CommandInvocationException("Not a UUID or name of an online player");
|
||||
}
|
||||
|
|
@ -59,6 +63,11 @@ public class PlayerArgumentType {
|
|||
return player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String readRawInput(ArgumentReader reader) {
|
||||
return reader.readWord();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Set<String> getDefaultSuggestions(CommandContext ctx) {
|
||||
return Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toSet());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue