/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* com.google.gson.JsonArray
* com.google.gson.JsonElement
* com.google.gson.JsonObject
* com.mojang.brigadier.CommandDispatcher
* com.mojang.brigadier.arguments.ArgumentType
* com.mojang.brigadier.tree.ArgumentCommandNode
* com.mojang.brigadier.tree.CommandNode
* com.mojang.brigadier.tree.LiteralCommandNode
* com.mojang.brigadier.tree.RootCommandNode
* com.mojang.logging.LogUtils
* com.mojang.serialization.DynamicOps
* com.mojang.serialization.JsonOps
* it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet
* org.slf4j.Logger
*/
package net.minecraft.commands.synchronization;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.arguments.ArgumentType;
import com.mojang.brigadier.tree.ArgumentCommandNode;
import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode;
import com.mojang.brigadier.tree.RootCommandNode;
import com.mojang.logging.LogUtils;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.JsonOps;
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
import java.lang.runtime.SwitchBootstraps;
import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import net.minecraft.commands.synchronization.ArgumentTypeInfo;
import net.minecraft.commands.synchronization.ArgumentTypeInfos;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.server.permissions.PermissionCheck;
import net.minecraft.server.permissions.PermissionProviderCheck;
import org.slf4j.Logger;
public class ArgumentUtils {
private static final Logger LOGGER = LogUtils.getLogger();
private static final byte NUMBER_FLAG_MIN = 1;
private static final byte NUMBER_FLAG_MAX = 2;
public static int createNumberFlags(boolean hasMin, boolean hasMax) {
int result = 0;
if (hasMin) {
result |= 1;
}
if (hasMax) {
result |= 2;
}
return result;
}
public static boolean numberHasMin(byte flags) {
return (flags & 1) != 0;
}
public static boolean numberHasMax(byte flags) {
return (flags & 2) != 0;
}
private static , T extends ArgumentTypeInfo.Template> void serializeArgumentCap(JsonObject result, ArgumentTypeInfo info, ArgumentTypeInfo.Template argumentType) {
info.serializeToJson(argumentType, result);
}
private static > void serializeArgumentToJson(JsonObject result, T argument) {
ArgumentTypeInfo.Template template = ArgumentTypeInfos.unpack(argument);
result.addProperty("type", "argument");
result.addProperty("parser", String.valueOf(BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getKey(template.type())));
JsonObject type = new JsonObject();
ArgumentUtils.serializeArgumentCap(type, template.type(), template);
if (!type.isEmpty()) {
result.add("properties", (JsonElement)type);
}
}
public static JsonObject serializeNodeToJson(CommandDispatcher dispatcher, CommandNode node) {
Collection path;
Object rootNode;
JsonObject result = new JsonObject();
CommandNode commandNode = node;
Objects.requireNonNull(commandNode);
CommandNode commandNode2 = commandNode;
int n = 0;
switch (SwitchBootstraps.typeSwitch("typeSwitch", new Object[]{RootCommandNode.class, LiteralCommandNode.class, ArgumentCommandNode.class}, commandNode2, n)) {
case 0: {
rootNode = (RootCommandNode)commandNode2;
result.addProperty("type", "root");
break;
}
case 1: {
LiteralCommandNode literalNode = (LiteralCommandNode)commandNode2;
result.addProperty("type", "literal");
break;
}
case 2: {
ArgumentCommandNode argumentNode = (ArgumentCommandNode)commandNode2;
ArgumentUtils.serializeArgumentToJson(result, argumentNode.getType());
break;
}
default: {
LOGGER.error("Could not serialize node {} ({})!", node, node.getClass());
result.addProperty("type", "unknown");
}
}
Collection children = node.getChildren();
if (!children.isEmpty()) {
JsonObject childrenObject = new JsonObject();
rootNode = children.iterator();
while (rootNode.hasNext()) {
CommandNode child = (CommandNode)rootNode.next();
childrenObject.add(child.getName(), (JsonElement)ArgumentUtils.serializeNodeToJson(dispatcher, child));
}
result.add("children", (JsonElement)childrenObject);
}
if (node.getCommand() != null) {
result.addProperty("executable", Boolean.valueOf(true));
}
if ((rootNode = node.getRequirement()) instanceof PermissionProviderCheck) {
PermissionProviderCheck permissionCheck = (PermissionProviderCheck)rootNode;
JsonElement permissions = (JsonElement)PermissionCheck.CODEC.encodeStart((DynamicOps)JsonOps.INSTANCE, (Object)permissionCheck.test()).getOrThrow(error -> new IllegalStateException("Failed to serialize requirement: " + error));
result.add("permissions", permissions);
}
if (node.getRedirect() != null && !(path = dispatcher.getPath(node.getRedirect())).isEmpty()) {
JsonArray target = new JsonArray();
for (String piece : path) {
target.add(piece);
}
result.add("redirect", (JsonElement)target);
}
return result;
}
public static Set> findUsedArgumentTypes(CommandNode node) {
ReferenceOpenHashSet visitedNodes = new ReferenceOpenHashSet();
HashSet result = new HashSet();
ArgumentUtils.findUsedArgumentTypes(node, result, visitedNodes);
return result;
}
private static void findUsedArgumentTypes(CommandNode node, Set> output, Set> visitedNodes) {
if (!visitedNodes.add(node)) {
return;
}
if (node instanceof ArgumentCommandNode) {
ArgumentCommandNode arg = (ArgumentCommandNode)node;
output.add(arg.getType());
}
node.getChildren().forEach(child -> ArgumentUtils.findUsedArgumentTypes(child, output, visitedNodes));
CommandNode redirect = node.getRedirect();
if (redirect != null) {
ArgumentUtils.findUsedArgumentTypes(redirect, output, visitedNodes);
}
}
}