/// <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());
        }