public async ValueTask Invoke(CommandArgument argument)
        {
            var currentArgument = argument;

            if (argument.Command == null)
            {
                if (!CommandContainer.TryAssignCommand(argument, out var nextArgument))
                {
                    Logger.LogWarning($"Unknown command {argument.Command}");
                    return;
                }
                else
                {
                    currentArgument = nextArgument;
                }
            }

            if (currentArgument.Command == "help" && CurrentScope.TryResolve <ICommandHelp>(out var help))
            {
                help.HandleHelp(argument);
                return;
            }

            if (!commandHandlers.TryGetValue(currentArgument.Command, out var handlerInfo) || handlerInfo == null)
            {
                Logger.LogWarning($"Unknown command {argument.Command}");
                return;
            }
            object ret;

            if (handlerInfo.CommandHandler.GetParameters().Length == 0)
            {
                ret = handlerInfo.CommandHandler.Invoke(CommandContainer, null);
            }
            else
            {
                var parser = parsers[handlerInfo.HandlerParserType];
                ret = handlerInfo.CommandHandler.Invoke(CommandContainer, parser.ParseCommandArgument(argument).ToArray());
            }
            if (ret != null && handlerInfo.IsAwaitable)
            {
                switch (ret)
                {
                case Task task:
                    await task;
                    return;

                case ValueTask valueTask:
                    await valueTask;
                    return;
                }
            }
        }