diff --git a/src/main/java/de/kencommand/api/structure/node/LiteralNode.java b/src/main/java/de/kencommand/api/structure/node/LiteralNode.java index 27bb127..a2a3622 100644 --- a/src/main/java/de/kencommand/api/structure/node/LiteralNode.java +++ b/src/main/java/de/kencommand/api/structure/node/LiteralNode.java @@ -9,7 +9,7 @@ public interface LiteralNode> { void addLiteral(@NotNull CommandNode commandNode); - CommandNode getLiteral(@NotNull String name); + CommandNode getLiteral(@NotNull String name); @NotNull Set> getLiterals(); } diff --git a/src/main/java/de/kencommand/impl/parsing/CommandNodeParser.java b/src/main/java/de/kencommand/impl/parsing/CommandNodeParser.java new file mode 100644 index 0000000..422e91f --- /dev/null +++ b/src/main/java/de/kencommand/impl/parsing/CommandNodeParser.java @@ -0,0 +1,29 @@ +package de.kencommand.impl.parsing; + +import de.kencommand.api.processing.CommandContext; +import de.kencommand.api.processing.CommandExecutor; +import de.kencommand.api.structure.node.CommandNode; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; + +@RequiredArgsConstructor +public class CommandNodeParser> { + + public CommandExecutor parse(CommandNode commandNode, String[] args) { + var iter = Arrays.stream(args).iterator(); + + while (true) { + if (!iter.hasNext()) { + // literals/arguments are optional if the node itself is executable + if (commandNode.getExecutor() == null) throw new RuntimeException("no literal given but required"); + // TODO parse arguments for executor ig, or rather do that in a separate method + return commandNode.getExecutor(); + } + + final var arg = iter.next(); + // TODO rethink + return parse(commandNode.getLiteral(arg), args); + } + } +}