public async Task <Option <Repository> > HandleAsync(RemoteGithubCommand cmd)
        {
            _consoleService.WriteLine();
            _consoleService.WriteLine("Time to pick a remote:");
            _consoleService.WriteLine("1: Create New.");
            _consoleService.WriteLine("2: Search Existing.");
            _consoleService.WriteLine("3: I'll do it later.");
            var choice = _consoleService.ReadInputNumber(min: 1, max: 3);

            if (!choice.HasValue || choice.ValueOrFailure() == 3)
            {
                return(Option.None <Repository>());
            }
            else if (choice.ValueOrFailure() == 1)
            {
                try
                {
                    _consoleService.WriteLine("Your repository should be?");
                    _consoleService.WriteLine("If you input \"exit\", will skip creating the repository.");
                    _consoleService.WriteLine("1: Private");
                    _consoleService.WriteLine("2: Public");
                    var choiceOption  = _consoleService.ReadInputNumber(1, 2);
                    var privateOption = choiceOption.Map((value) => value == 1 ? true : false);
                    if (privateOption.ValueOrDefault() is bool visibility)
                    {
                        return(Option.Some(await _client.Repository.Create(new NewRepository(cmd.RepoName)
                        {
                            Private = visibility
                        })));
                    }

                    return(Option.None <Repository>());
                }
                catch (Octokit.RepositoryExistsException repositoryExistsException)
                {
                    _consoleService.WriteLine("A repository with the same name already exist on GitHub.");
                    _consoleService.WriteLine($"Repository Name: {repositoryExistsException.RepositoryName}");
                    _consoleService.WriteLine("Do you want to use this one?");
                    if (_consoleService.AskForConfirmation())
                    {
                        var user = await _client.User.Current();

                        return(Option.Some(await _client.Repository.Get(user.Login, repositoryExistsException.RepositoryName)));
                    }
                    else
                    {
                        return(await HandleAsync(cmd));
                    }
                }
            }
            else if (choice.ValueOrFailure() == 2)
            {
                _consoleService.WriteLine("You can type a search string:");
                var search = _consoleService.ReadLine();
                _consoleService.WriteLine("Retrieving repo list...");
                var repoList = await _client.Repository.GetAllForCurrent();

                if (!string.IsNullOrEmpty(search))
                {
                    repoList = repoList.Where(r => r.Name.Contains(search.Trim())).Select(repository =>
                    {
                        var sort = repository.Name.StartsWith(search.Trim()) ? 1 : 0;
                        return(sort, repository);
                    })
                               .OrderByDescending(tuple => tuple.sort)
                               .Select(tuple => tuple.repository)
                               .ToList();
                }

                _consoleService.WriteLine("Pick a remote:");

                for (var i = 0; i < repoList.Count; i++)
                {
                    _consoleService.WriteLine($"{i + 1}: {repoList[i].Name}");
                }

                choice = _consoleService.ReadInputNumber(min: 1, max: repoList.Count);
                if (!choice.HasValue)
                {
                    return(Option.None <Repository>());
                }

                return(Option.Some(repoList[choice.ValueOrFailure() - 1]));
            }

            return(Option.None <Repository>());
        }