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 javax.annotation.Nullable; import net.minecraft.commands.arguments.SignedArgument; public record SignableCommand(List> arguments) { public static boolean hasSignableArguments(ParseResults p_328269_) { return !of(p_328269_).arguments().isEmpty(); } public static SignableCommand of(ParseResults p_250316_) { String s = p_250316_.getReader().getString(); CommandContextBuilder commandcontextbuilder = p_250316_.getContext(); CommandContextBuilder commandcontextbuilder1 = commandcontextbuilder; List> list = collectArguments(s, commandcontextbuilder); CommandContextBuilder commandcontextbuilder2; while ( (commandcontextbuilder2 = commandcontextbuilder1.getChild()) != null && commandcontextbuilder2.getRootNode() != commandcontextbuilder.getRootNode() ) { list.addAll(collectArguments(s, commandcontextbuilder2)); commandcontextbuilder1 = commandcontextbuilder2; } return new SignableCommand<>(list); } private static List> collectArguments(String p_252055_, CommandContextBuilder p_251770_) { List> list = new ArrayList<>(); for (ParsedCommandNode parsedcommandnode : p_251770_.getNodes()) { if (parsedcommandnode.getNode() instanceof ArgumentCommandNode argumentcommandnode && argumentcommandnode.getType() instanceof SignedArgument ) { ParsedArgument parsedargument = p_251770_.getArguments().get(argumentcommandnode.getName()); if (parsedargument != null) { String s = parsedargument.getRange().get(p_252055_); list.add(new SignableCommand.Argument<>(argumentcommandnode, s)); } } } return list; } @Nullable public SignableCommand.Argument getArgument(String p_336083_) { for (SignableCommand.Argument argument : this.arguments) { if (p_336083_.equals(argument.name())) { return argument; } } return null; } public record Argument(ArgumentCommandNode node, String value) { public String name() { return this.node.getName(); } } }