diff --git a/client/src/client.rs b/client/src/client.rs index 8031221..d68cbfc 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -577,9 +577,15 @@ impl Client { &mut self, response: server::RoomLeaveResponse, ) { - if let Err(err) = self.rooms.leave(&response.room_name) { - error!("RoomLeaveResponse: {}", err); - } + let room = match self.rooms.get_mut_strict(&response.room_name) { + Ok(room) => room, + Err(err) => { + error!("RoomLeaveResponse: {}", err); + return; + } + }; + + room.leave(); self.send_to_controller(control::Response::RoomLeaveResponse( control::RoomLeaveResponse { diff --git a/client/src/room/map.rs b/client/src/room/map.rs index 3d4b345..a8f000f 100644 --- a/client/src/room/map.rs +++ b/client/src/room/map.rs @@ -112,6 +112,20 @@ impl RoomEntry { )), } } + + /// Records that we have now left the given room. + pub fn leave(&mut self) { + match self.state.membership { + RoomMembership::Leaving => info!("Left room {:?}", self.name), + + membership => warn!( + "Left room {:?} with wrong membership: {:?}", + self.name, membership + ), + } + + self.state.membership = RoomMembership::NonMember; + } } /// Contains the mapping from room names to room data and provides a clean @@ -235,23 +249,6 @@ impl RoomMap { // TODO: Move remaining methods to `RoomEntry`. - /// Records that we have now left the given room. - pub fn leave(&mut self, room_name: &str) -> Result<(), RoomError> { - let room = self.get_mut_strict(room_name)?; - - match room.state.membership { - RoomMembership::Leaving => info!("Left room {:?}", room_name), - - membership => warn!( - "Left room {:?} with wrong membership: {:?}", - room_name, membership - ), - } - - room.state.membership = RoomMembership::NonMember; - Ok(()) - } - /// Inserts the given user in the given room's set of members. /// Returns an error if the room is not found. pub fn insert_member( @@ -394,6 +391,27 @@ mod tests { ); } + #[test] + fn entry_leave() { + let mut room = RoomEntry::new( + "bleep".to_string(), + RoomState { + membership: RoomMembership::Member, + ..RoomState::default() + }, + ); + + room.leave(); + + assert_eq!( + room.into_state(), + RoomState { + membership: RoomMembership::NonMember, + ..RoomState::default() + } + ); + } + #[test] fn map_new_is_empty() { assert_eq!(RoomMap::new().get_room_list(), vec![]);