diff --git a/src/network_event/server_event.rs b/src/network_event/server_event.rs index 2c64b13c..e4a7ed07 100644 --- a/src/network_event/server_event.rs +++ b/src/network_event/server_event.rs @@ -323,7 +323,7 @@ pub fn send_with( } SendMode::Direct(client_id) => { if client_id != SERVER_ID { - if let Some(client_info) = clients_info.get(client_id) { + if let Some(client_info) = clients_info.get_client(client_id) { let message = serialize_with(client_info, None, &serialize_fn)?; server.send_message(client_info.id(), channel, message.bytes); } diff --git a/src/server/clients_info.rs b/src/server/clients_info.rs index 11f23025..1f7302ba 100644 --- a/src/server/clients_info.rs +++ b/src/server/clients_info.rs @@ -44,14 +44,42 @@ impl ClientsInfo { /// Returns a reference to a connected client's info. /// /// This operation is *O*(*n*). - pub fn get(&self, client_id: ClientId) -> Option<&ClientInfo> { + /// See also [`Self::get_client`] for the fallible version. + /// + /// # Panics + /// + /// Panics if passed client ID is not connected. + pub fn client(&self, client_id: ClientId) -> &ClientInfo { + self.get_client(client_id) + .unwrap_or_else(|| panic!("{client_id:?} should be connected")) + } + + /// Returns a mutable reference to a connected client's info. + /// + /// This operation is *O*(*n*). + /// See also [`Self::get_client_mut`] for the fallible version. + /// + /// # Panics + /// + /// Panics if passed client ID is not connected. + pub fn client_mut(&mut self, client_id: ClientId) -> &mut ClientInfo { + self.get_client_mut(client_id) + .unwrap_or_else(|| panic!("{client_id:?} should be connected")) + } + + /// Returns a reference to a connected client's info. + /// + /// This operation is *O*(*n*). + /// See also [`Self::client`] for the panicking version. + pub fn get_client(&self, client_id: ClientId) -> Option<&ClientInfo> { self.info.iter().find(|info| info.id == client_id) } /// Returns a mutable reference to a connected client's info. /// /// This operation is *O*(*n*). - pub fn get_mut(&mut self, client_id: ClientId) -> Option<&mut ClientInfo> { + /// See also [`Self::client`] for the panicking version. + pub fn get_client_mut(&mut self, client_id: ClientId) -> Option<&mut ClientInfo> { self.info.iter_mut().find(|info| info.id == client_id) } diff --git a/tests/replication.rs b/tests/replication.rs index 9b68494f..df5af72b 100644 --- a/tests/replication.rs +++ b/tests/replication.rs @@ -774,7 +774,7 @@ fn all_visibility() { let client_transport = client_app.world.resource::(); let client_id = ClientId::from_raw(client_transport.client_id()); let mut clients_info = server_app.world.resource_mut::(); - let visibility = clients_info.get_mut(client_id).unwrap().visibility_mut(); + let visibility = clients_info.client_mut(client_id).visibility_mut(); visibility.set_visibility(server_entity, false); assert!( visibility.is_visible(server_entity), @@ -809,7 +809,7 @@ fn blacklist_visibility() { let client_transport = client_app.world.resource::(); let client_id = ClientId::from_raw(client_transport.client_id()); let clients_info = server_app.world.resource::(); - let visibility = clients_info.get(client_id).unwrap().visibility(); + let visibility = clients_info.client(client_id).visibility(); assert!(visibility.is_visible(server_entity)); server_app.update(); @@ -844,7 +844,7 @@ fn blacklist_visibility_add_remove() { let client_transport = client_app.world.resource::(); let client_id = ClientId::from_raw(client_transport.client_id()); let mut clients_info = server_app.world.resource_mut::(); - let visibility = clients_info.get_mut(client_id).unwrap().visibility_mut(); + let visibility = clients_info.client_mut(client_id).visibility_mut(); visibility.set_visibility(server_entity, false); assert!(!visibility.is_visible(server_entity)); @@ -855,7 +855,7 @@ fn blacklist_visibility_add_remove() { // Reverse visibility back. let mut clients_info = server_app.world.resource_mut::(); - let visibility = clients_info.get_mut(client_id).unwrap().visibility_mut(); + let visibility = clients_info.client_mut(client_id).visibility_mut(); visibility.set_visibility(server_entity, true); server_app.update(); @@ -890,7 +890,7 @@ fn whitelist_visibility() { let client_transport = client_app.world.resource::(); let client_id = ClientId::from_raw(client_transport.client_id()); let clients_info = server_app.world.resource::(); - let visibility = clients_info.get(client_id).unwrap().visibility(); + let visibility = clients_info.client(client_id).visibility(); assert!(!visibility.is_visible(server_entity)); server_app.update(); @@ -925,7 +925,7 @@ fn whitelist_visibility_add_remove() { let client_transport = client_app.world.resource::(); let client_id = ClientId::from_raw(client_transport.client_id()); let mut clients_info = server_app.world.resource_mut::(); - let visibility = clients_info.get_mut(client_id).unwrap().visibility_mut(); + let visibility = clients_info.client_mut(client_id).visibility_mut(); visibility.set_visibility(server_entity, true); assert!(visibility.is_visible(server_entity)); @@ -939,7 +939,7 @@ fn whitelist_visibility_add_remove() { // Reverse visibility. let mut clients_info = server_app.world.resource_mut::(); - let visibility = clients_info.get_mut(client_id).unwrap().visibility_mut(); + let visibility = clients_info.client_mut(client_id).visibility_mut(); visibility.set_visibility(server_entity, false); server_app.update();