private static CreateCommandResult ToOption
        (
            IChildNode child,
            [NotNullWhen(true)] out IApplicationCommandOption?option,
            ulong depth = 0
        )
        {
            option = null;

            switch (child)
            {
            case CommandNode command:
            {
                var createParameterOptions = CreateCommandParameterOptions(command, out var parameterOptions);
                if (!createParameterOptions.IsSuccess)
                {
                    return(createParameterOptions);
                }

                option = new ApplicationCommandOption
                         (
                    SubCommand,
                    command.Key,
                    command.Shape.Description,
                    default,
                    default,
                    default,
                    new Optional <IReadOnlyList <IApplicationCommandOption> >(parameterOptions)
                         );

                return(CreateCommandResult.FromSuccess());
            }
        /// <summary>
        /// Converts the command tree to a set of Discord application commands.
        /// </summary>
        /// <param name="tree">The command tree.</param>
        /// <param name="commands">The created commands, if any.</param>
        /// <returns>A creation result which may or may not have succeeded.</returns>
        public static CreateCommandResult CreateApplicationCommands
        (
            this CommandTree tree,
            [NotNullWhen(true)] out IReadOnlyList <IApplicationCommandOption>?commands
        )
        {
            commands = null;

            var createdCommands = new List <IApplicationCommandOption>();

            foreach (var child in tree.Root.Children)
            {
                var createOption = ToOption(child, out var option);
                if (!createOption.IsSuccess)
                {
                    return(createOption);
                }

                createdCommands.Add(option !);
            }

            if (createdCommands.Count > MaxRootCommandsOrGroups)
            {
                return(CreateCommandResult.FromError("Too many root-level commands or groups."));
            }

            if (createdCommands.GroupBy(c => c.Name).Any(g => g.Count() > 1))
            {
                return(CreateCommandResult.FromError("Overloads are not supported."));
            }

            commands = createdCommands;
            return(CreateCommandResult.FromSuccess());
        }