private void sendUsageDetailed(Sender sender, String label) {
        List<GenericChildCommand> subs = this.children.stream()
                .filter(s -> s.isAuthorized(sender, this.type))
                .collect(Collectors.toList());

        if (!subs.isEmpty()) {
            switch (this.type) {
                case USER:
                    Message.MAIN_COMMAND_USAGE_HEADER.send(sender, getName(), String.format("/%s user <user> " + getName().toLowerCase(Locale.ROOT), label));
                    break;
                case GROUP:
                    Message.MAIN_COMMAND_USAGE_HEADER.send(sender, getName(), String.format("/%s group <group> " + getName().toLowerCase(Locale.ROOT), label));
                    break;
                default:
                    throw new AssertionError(this.type);
            }

            for (GenericChildCommand s : subs) {
                s.sendUsage(sender);
            }

        } else {
            Message.COMMAND_NO_PERMISSION.send(sender);
        }
    }
A shared main command. Shared meaning it can apply to both users and groups.
This extends sub command as they're actually sub commands of the main user/group commands.
@param <T>
common/src/main/java/me/lucko/luckperms/common/command/abstraction/GenericParentCommand.java