Comandos Hijos

El constructor CommandSpec soporta estructuras de comando jerárquicas como esta:

  • /mail (parent command)

    • /mail send (child command)

    • /mail read (child command)

Cada comando hijo es un CommandSpec separado y puede ser creado en la misma forma que un comando regular.

import org.spongepowered.api.text.Text;
import org.spongepowered.api.command.spec.CommandSpec;

// /mail read
CommandSpec readCmd = CommandSpec.builder()
    .permission("myplugin.mail.read")
    .description(Text.of("Read your inbox"))
    .executor(...)
    .build();

// /mail send
CommandSpec sendCmd = CommandSpec.builder()
    .permission("myplugin.mail.send")
    .description(Text.of("Send a mail"))
    .arguments(...)
    .executor(...)
    .build();

En lugar de registrarlos en el servicio de comando, los comandos secundarios se registran en su comando principal utilizando el método CommandSpec.Builder#child(CommandCallable, String…). Están registrados con una lista de alias. El primer alias proporcionado es el principal y aparecerá en el mensaje de uso.

import org.spongepowered.api.Sponge;

PluginContainer plugin = ...;

CommandSpec mailCommandSpec = CommandSpec.builder()
    .permission("myplugin.mail.base")
    .description(Text.of("Send and receive mails"))
    .child(readCmd, "read", "r", "inbox")
    .child(sendCmd, "send", "s", "write")
    .build();

Sponge.getCommandManager().register(plugin, mailCommandSpec, "mail", "email");

Fallback Behavior

Si un comando tiene comandos secundarios, un CommandExecutor, establecido a través de :javadoc:`CommandSpec.Builder#executor(CommandExecutor)`y sus asociados :javadoc:`CommandSpec.Builder#arguments(CommandElement)`` son opcionales. El comportamiento de error en la selección y el análisis de argumentos de los comandos secundarios depende de si este ejecutor padre existe.

Si no se ha establecido un ejecutor padre, entonces si el comando hijo solicitado no se pudo encontrar o los argumentos no se pueden analizar, se lanzará un ArgumentParseException.

Si se ha establecido un ejecutor padre para el comando padre, es usado como alternativa si el primer argumento no coincide con uno de los alias del comando hijo. Si se selecciona un comando secundario pero los argumentos no se analizan, sucederá uno de los siguientes casos en función de qué CommandSpec.Builder#childArgumentParseExceptionFallback(boolean) es establecido:

  • Si es true (por defecto), el ArgumentParseException es descartado y se analizan los argumentos de los comandos principales. Si fallan, se mostrará la excepción para el comando principal. Este es el mismo comportamiento que las revisiones previas de API, donde no se mostrarán las excepciones de análisis de argumentos del comando hijo.

  • Si es “falso”, el ejecutor principal no es ejecutado y el ArgumentParseException es arrojado, regresando la excepción del conflicto del comando secundario que ha fallado en el parafraseo, pero puede prevenir que sea ejecutada alguna combinación de comandos principales y conflictos (si el primer argumento de respaldo pudiera ser el mismo que el comando secundario).

In all cases, if the arguments parse successfully but the child executor throws an exception, the fallback executor (if any) is not executed and the error message from the child executor is displayed.