package net.minecraft.network.chat; import com.mojang.brigadier.ParseResults; import com.mojang.brigadier.context.CommandContextBuilder; import com.mojang.brigadier.context.ParsedArgument; import com.mojang.brigadier.context.ParsedCommandNode; import com.mojang.brigadier.tree.ArgumentCommandNode; import java.util.ArrayList; import java.util.List; import net.minecraft.commands.arguments.SignedArgument; import org.jetbrains.annotations.Nullable; public record SignableCommand(List> arguments) { public static boolean hasSignableArguments(ParseResults parseResults) { return !of(parseResults).arguments().isEmpty(); } public static SignableCommand of(ParseResults results) { String string = results.getReader().getString(); CommandContextBuilder commandContextBuilder = results.getContext(); CommandContextBuilder commandContextBuilder2 = commandContextBuilder; List> list = collectArguments(string, commandContextBuilder); CommandContextBuilder commandContextBuilder3; while ((commandContextBuilder3 = commandContextBuilder2.getChild()) != null && commandContextBuilder3.getRootNode() != commandContextBuilder.getRootNode()) { list.addAll(collectArguments(string, commandContextBuilder3)); commandContextBuilder2 = commandContextBuilder3; } return new SignableCommand<>(list); } private static List> collectArguments(String key, CommandContextBuilder contextBuilder) { List> list = new ArrayList(); for (ParsedCommandNode parsedCommandNode : contextBuilder.getNodes()) { if (parsedCommandNode.getNode() instanceof ArgumentCommandNode argumentCommandNode && argumentCommandNode.getType() instanceof SignedArgument) { ParsedArgument parsedArgument = (ParsedArgument)contextBuilder.getArguments().get(argumentCommandNode.getName()); if (parsedArgument != null) { String string = parsedArgument.getRange().get(key); list.add(new SignableCommand.Argument<>(argumentCommandNode, string)); } } } return list; } @Nullable public SignableCommand.Argument getArgument(String argument) { for (SignableCommand.Argument argument2 : this.arguments) { if (argument.equals(argument2.name())) { return argument2; } } return null; } public record Argument(ArgumentCommandNode node, String value) { public String name() { return this.node.getName(); } } }