Skip to content

Commit

Permalink
Add panicking versions for getting ClientInfo
Browse files Browse the repository at this point in the history
  • Loading branch information
Shatur committed Jan 15, 2024
1 parent 7515312 commit e6bac4b
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/network_event/server_event.rs
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,7 @@ pub fn send_with<T>(
}
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);
}
Expand Down
32 changes: 30 additions & 2 deletions src/server/clients_info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
14 changes: 7 additions & 7 deletions tests/replication.rs
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,7 @@ fn all_visibility() {
let client_transport = client_app.world.resource::<NetcodeClientTransport>();
let client_id = ClientId::from_raw(client_transport.client_id());
let mut clients_info = server_app.world.resource_mut::<ClientsInfo>();
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),
Expand Down Expand Up @@ -809,7 +809,7 @@ fn blacklist_visibility() {
let client_transport = client_app.world.resource::<NetcodeClientTransport>();
let client_id = ClientId::from_raw(client_transport.client_id());
let clients_info = server_app.world.resource::<ClientsInfo>();
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();
Expand Down Expand Up @@ -844,7 +844,7 @@ fn blacklist_visibility_add_remove() {
let client_transport = client_app.world.resource::<NetcodeClientTransport>();
let client_id = ClientId::from_raw(client_transport.client_id());
let mut clients_info = server_app.world.resource_mut::<ClientsInfo>();
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));

Expand All @@ -855,7 +855,7 @@ fn blacklist_visibility_add_remove() {

// Reverse visibility back.
let mut clients_info = server_app.world.resource_mut::<ClientsInfo>();
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();
Expand Down Expand Up @@ -890,7 +890,7 @@ fn whitelist_visibility() {
let client_transport = client_app.world.resource::<NetcodeClientTransport>();
let client_id = ClientId::from_raw(client_transport.client_id());
let clients_info = server_app.world.resource::<ClientsInfo>();
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();
Expand Down Expand Up @@ -925,7 +925,7 @@ fn whitelist_visibility_add_remove() {
let client_transport = client_app.world.resource::<NetcodeClientTransport>();
let client_id = ClientId::from_raw(client_transport.client_id());
let mut clients_info = server_app.world.resource_mut::<ClientsInfo>();
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));

Expand All @@ -939,7 +939,7 @@ fn whitelist_visibility_add_remove() {

// Reverse visibility.
let mut clients_info = server_app.world.resource_mut::<ClientsInfo>();
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();
Expand Down

0 comments on commit e6bac4b

Please sign in to comment.