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, () => { }); } }))); }