}
_ => empty().boxed(),
},
- ClientInterest::Game { id } => match &mut self.client {
- &mut ClientState::LoggedIn { username, state: LoggedInState::InGame { ref mut game } } if game.id() == id => {
+ ClientInterest::Game { id } => match self.client {
+ ClientState::LoggedIn { username, state: LoggedInState::InGame { ref mut game } } if game.id() == id => {
let id = game.id();
let from = game.actions_len();
match self.server.game_state(id, from).await {
pub fn interests(&self) -> HashSet<ClientInterest> {
let mut ret = HashSet::new();
- if let &ClientState::LoggedIn { username, ref state } = &self.client {
+ if let ClientState::LoggedIn { username, ref state } = self.client {
ret.insert(ClientInterest::User { username });
match state {
LoggedInState::Idle => {}
}
(&mut ClientState::LoginAuthIssued { username, ref challenge }, ClientMessage::LoginAuthResponse { signature }) => {
if self.server.verify(username, &challenge, &signature).await {
- self.client = ClientState::LoggedIn { username: username.clone(), state: LoggedInState::Idle };
+ self.client = ClientState::LoggedIn { username, state: LoggedInState::Idle };
ServerMessage::LoginSuccess
} else {
self.client = ClientState::Connected;
for game in games.clone() {
game_list.push(game);
}
- self.client = ClientState::LoggedIn { username: username.clone(), state: LoggedInState::InLobby { game_list } };
+ self.client = ClientState::LoggedIn { username, state: LoggedInState::InLobby { game_list } };
ServerMessage::JoinLobbySuccess { games }
}
Err(err) => ServerMessage::JoinLobbyFailure { reason: err.to_string() },
error!("Action from database failed to apply: {}", err);
}
}
- self.client = ClientState::LoggedIn { username: username.clone(), state: LoggedInState::InGame { game } };
+ self.client = ClientState::LoggedIn { username, state: LoggedInState::InGame { game } };
ServerMessage::JoinGameSuccess { summary, actions: actions_view }
}
(Err(err), _, _) | (_, Err(err), _) | (_, _, Err(err)) => ServerMessage::JoinGameFailure { reason: err.to_string() },
pub async fn start(mut self, update_stream: Receiver<ClientInterest>) {
let mut update_stream = update_stream.dedup_ready();
- while let Some(_) = update_stream.next().await {
+ while update_stream.next().await.is_some() {
match self.retrieve_updates().await {
Ok(Termination::Continue) => continue,
Ok(Termination::Break) => break,
+use std::cmp::Ordering;
use std::collections::{HashMap, HashSet};
use std::convert::TryInto;
}
}
}
- self.all_bets_are_in() && self.all_bets_are_equal() || self.players_able_to_bet() <= 1 && self.bets.len() == 0
+ self.all_bets_are_in() && self.all_bets_are_equal() || self.players_able_to_bet() <= 1 && self.bets.is_empty()
}
fn remove_ghosts(&mut self) -> Result<(), ActionError> {
}
}
self.ghosts.retain(|_, &mut turns| turns > 0);
- for (_, turns) in &mut self.ghosts {
+ for turns in self.ghosts.values_mut() {
*turns -= 1;
}
Ok(())
(_, Action::Fold) | (_, Action::Bet { .. }) if self.active != Some(username) => Err(ActionError::OutOfTurn),
(_, Action::Fold) if self.chips_to_call(username) == 0 => Err(ActionError::CannotFold),
(_, Action::Fold) => Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Fold })),
- (_, Action::Bet { chips }) => {
- let stack = self.stack(username);
- if chips > stack {
- Err(ActionError::NotEnoughChips)
- } else if chips == stack {
- Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Bet { chips } }))
- } else {
+ (_, Action::Bet { chips }) => match chips.cmp(&self.stack(username)) {
+ Ordering::Greater => Err(ActionError::NotEnoughChips),
+ Ordering::Equal => Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Bet { chips } })),
+ Ordering::Less => {
let to_call = self.chips_to_call(username);
let min_raise = self.min_raise();
- if chips < to_call {
- Err(ActionError::BetSizeTooSmall)
- } else if chips > to_call && chips < to_call + min_raise {
+ if chips < to_call || chips > to_call && chips < to_call + min_raise {
Err(ActionError::BetSizeTooSmall)
} else {
Ok(ValidatedUserAction(UserAction { timestamp, username, action: Action::Bet { chips } }))
}
}
- }
+ },
(_, _) => Err(ActionError::InvalidActionForGameType),
}
}
}
pub fn contains_player(&self, username: Username) -> bool {
- for (_, &player) in &self.players {
+ for &player in self.players.values() {
if player == username {
return true;
}
}
}
-const TAKE_ACTION_LUA_SCRIPT: &'static str = r#"
+const TAKE_ACTION_LUA_SCRIPT: &str = r#"
local len = redis.call('llen', KEYS[1])
local expected = tonumber(ARGV[1])
if (len == expected) then
where
W: ?Sized + RedisWrite,
{
- match serde_json::to_vec(&self.0) {
- Ok(bytes) => out.write_arg(&bytes),
- Err(_) => return,
+ if let Ok(bytes) = serde_json::to_vec(&self.0) {
+ out.write_arg(&bytes);
}
}
loop {
match this.item {
Some(item) => match this.stream.as_mut().poll_next(cx) {
- Poll::Ready(Some(next)) if &next == &*item => continue,
+ Poll::Ready(Some(next)) if next == *item => continue,
Poll::Ready(Some(mut next)) => {
swap(item, &mut next);
return Poll::Ready(Some(next));