private void _ChoseCardDestination(CardReader reader, PlayerCard card, Action sentAction)
        {
            var baseNumber = CLH.PromptNumber("What station should I send this player to? (0 to ignore)", 0, PlayerCard.MAX_BASE_NUMBER + 1);

            if (baseNumber > 0)
            {
                card.BaseNumber = baseNumber - 1;
                sentAction();
                _SendToBase(reader, card);
            }
        }
        private Result _ProcessCard(CardReader reader)
        {
            #region Helper Methods
            Result <PlayerCard> isValidCard(string data)
            {
                var pc = new PlayerCard(data);

                return(pc.IsValid()
                    ? Result.Ok(pc)
                    : Result.Fail <PlayerCard>("Card not setup correctly!"));
            }

            Result <PlayerCard> formatCard(Result <PlayerCard> error)
            => CLH.PromptYesNo($"Error reading card data: {error.Error} Format?",
                               () => Result.Ok(_FormatCard(reader)),
                               () => error);

            Result <PlayerCard> getExistingCard(PlayerCard card)
            => _incomingCards.Contains(card)
                    ? Result.Ok(_incomingCards.Find(x => x.Equals(card)))
                    : Result.Fail <PlayerCard>($"No incoming cards with this player ID: {card.PlayerID}");

            Action <PlayerCard> handleExistingCard(PlayerCard currentCard)
            => existingCard =>
            {
                Console.WriteLine($"Found an incoming card: {existingCard}", Color.Green);
                if (existingCard.BaseNumber <= PlayerCard.MAX_BASE_NUMBER)
                {
                    _SendToBase(reader, existingCard);
                }
                else
                {
                    Console.WriteLine("Reached last base...");
                    _ChoseCardDestination(reader, currentCard, () => { });
                }
            };

            void handleNewCard(PlayerCard card, string msg, Action sentAction)
            {
                Console.WriteLine(msg);
                _ChoseCardDestination(reader, card, sentAction);
            };
            #endregion Helper Methods

            Console.WriteLine($"\n{DASHES}", Color.Green);
            Console.WriteLine("Waiting for card swipe...");
            return(reader.Read().GetReadableData()
                   .OnSuccess(isValidCard)
                   .OnFailure(formatCard)
                   .OnSuccess(card =>
                              getExistingCard(card).Match(
                                  Ok: handleExistingCard(card),
                                  Err: (err) =>
            {
                if (_cardsInSystem.Contains(card.PlayerID))
                {
                    handleNewCard(card, "This card appears to already be in the system!",
                                  () => _cardsInSystem.Remove(card.PlayerID));
                }
                else
                {
                    handleNewCard(card, err, () => { });
                }
            })));
        }