From 152fc0320ffe361054324bf4de97642d561d4682 Mon Sep 17 00:00:00 2001 From: IceSentry Date: Wed, 8 Sep 2021 18:11:35 -0400 Subject: [PATCH 01/11] add try_single fallible variant --- crates/bevy_ecs/src/system/mod.rs | 10 ++++---- crates/bevy_ecs/src/system/query.rs | 38 +++++++++++++++++++++++++++-- examples/game/alien_cake_addict.rs | 2 +- examples/game/breakout.rs | 8 +++--- examples/shader/animate_shader.rs | 2 +- 5 files changed, 47 insertions(+), 13 deletions(-) diff --git a/crates/bevy_ecs/src/system/mod.rs b/crates/bevy_ecs/src/system/mod.rs index d4fd0ad79909c..5cdf68ad1a186 100644 --- a/crates/bevy_ecs/src/system/mod.rs +++ b/crates/bevy_ecs/src/system/mod.rs @@ -574,7 +574,7 @@ mod tests { let (a, query, _) = system_state.get(&world); assert_eq!(*a, A(42), "returned resource matches initial value"); assert_eq!( - *query.single().unwrap(), + *query.single(), B(7), "returned component matches initial value" ); @@ -601,7 +601,7 @@ mod tests { let (a, mut query) = system_state.get_mut(&mut world); assert_eq!(*a, A(42), "returned resource matches initial value"); assert_eq!( - *query.single_mut().unwrap(), + *query.single_mut(), B(7), "returned component matches initial value" ); @@ -618,18 +618,18 @@ mod tests { let mut system_state: SystemState>> = SystemState::new(&mut world); { let query = system_state.get(&world); - assert_eq!(*query.single().unwrap(), A(1)); + assert_eq!(*query.single(), A(1)); } { let query = system_state.get(&world); - assert!(query.single().is_err()); + assert!(query.try_single().is_err()); } world.entity_mut(entity).get_mut::().unwrap().0 = 2; { let query = system_state.get(&world); - assert_eq!(*query.single().unwrap(), A(2)); + assert_eq!(*query.single(), A(2)); } } diff --git a/crates/bevy_ecs/src/system/query.rs b/crates/bevy_ecs/src/system/query.rs index e550ac6fa027a..28a46b4732543 100644 --- a/crates/bevy_ecs/src/system/query.rs +++ b/crates/bevy_ecs/src/system/query.rs @@ -488,6 +488,32 @@ where } } + /// Gets the result of a single-result query. + /// + /// Assumes this query has only one result and panics if there are no or multiple results. + /// If you want to handle the error case yourself you can use the [`Self::try_single`] variant. + /// + /// # Example + /// + /// ``` + /// # use bevy_ecs::system::{Query, QuerySingleError}; + /// # use bevy_ecs::prelude::IntoSystem; + /// struct PlayerScore(i32); + /// fn player_scoring_system(query: Query<&PlayerScore>) { + /// let score = query.single(); + /// // do something with score + /// } + /// # let _check_that_its_a_system = player_scoring_system.system(); + /// ``` + /// + /// This can only be called for read-only queries, see [`Self::single_mut`] for write-queries. + pub fn single(&'s self) -> >::Item + where + Q::Fetch: ReadOnlyFetch, + { + self.try_single().unwrap() + } + /// Gets the result of a single-result query. /// /// If the query has exactly one result, returns the result inside `Ok` @@ -517,7 +543,7 @@ where /// ``` /// /// This can only be called for read-only queries, see [`Self::single_mut`] for write-queries. - pub fn single(&'s self) -> Result<>::Item, QuerySingleError> + pub fn try_single(&'s self) -> Result<>::Item, QuerySingleError> where Q::Fetch: ReadOnlyFetch, { @@ -534,9 +560,17 @@ where } } + /// Gets the query result if it is only a single result, otherwise panics + /// If you want to handle the error case yourself you can use the [`Self::try_single_mut`] variant. + pub fn single_mut(&mut self) -> >::Item { + self.try_single_mut().unwrap() + } + /// Gets the query result if it is only a single result, otherwise returns a /// [`QuerySingleError`]. - pub fn single_mut(&mut self) -> Result<>::Item, QuerySingleError> { + pub fn try_single_mut( + &mut self, + ) -> Result<>::Item, QuerySingleError> { let mut query = self.iter_mut(); let first = query.next(); let extra = query.next().is_some(); diff --git a/examples/game/alien_cake_addict.rs b/examples/game/alien_cake_addict.rs index a9158614012c5..c9172af5e38cf 100644 --- a/examples/game/alien_cake_addict.rs +++ b/examples/game/alien_cake_addict.rs @@ -352,7 +352,7 @@ fn rotate_bonus(game: Res, time: Res().unwrap().0 = 2; diff --git a/crates/bevy_ecs/src/system/query.rs b/crates/bevy_ecs/src/system/query.rs index 1953a7034510d..921454ec2c973 100644 --- a/crates/bevy_ecs/src/system/query.rs +++ b/crates/bevy_ecs/src/system/query.rs @@ -491,7 +491,7 @@ where /// Gets the result of a single-result query. /// /// Assumes this query has only one result and panics if there are no or multiple results. - /// Use [`Self::try_single`] to handle the error cases explicitly + /// Use [`Self::get_single`] to handle the error cases explicitly /// /// # Example /// @@ -512,7 +512,7 @@ where where Q::Fetch: ReadOnlyFetch, { - self.try_single().unwrap() + self.get_single().unwrap() } /// Gets the result of a single-result query. @@ -529,7 +529,7 @@ where /// struct Player; /// struct Position(f32, f32); /// fn player_system(query: Query<&Position, With>) { - /// match query.try_single() { + /// match query.get_single() { /// Ok(position) => { /// // do something with position /// } @@ -544,8 +544,8 @@ where /// # let _check_that_its_a_system = player_system.system(); /// ``` /// - /// This can only be called for read-only queries, see [`Self::try_single_mut`] for write-queries. - pub fn try_single(&'s self) -> Result<>::Item, QuerySingleError> + /// This can only be called for read-only queries, see [`Self::get_single_mut`] for write-queries. + pub fn get_single(&'s self) -> Result<>::Item, QuerySingleError> where Q::Fetch: ReadOnlyFetch, { @@ -563,15 +563,15 @@ where } /// Gets the query result if it is only a single result, otherwise panics - /// If you want to handle the error case yourself you can use the [`Self::try_single_mut`] variant. + /// If you want to handle the error case yourself you can use the [`Self::get_single_mut`] variant. #[track_caller] pub fn single_mut(&mut self) -> >::Item { - self.try_single_mut().unwrap() + self.get_single_mut().unwrap() } /// Gets the query result if it is only a single result, otherwise returns a /// [`QuerySingleError`]. - pub fn try_single_mut( + pub fn get_single_mut( &mut self, ) -> Result<>::Item, QuerySingleError> { let mut query = self.iter_mut(); From 6b71fa68b4e9530de1d73d33f9bda182fb9d0f42 Mon Sep 17 00:00:00 2001 From: IceSentry Date: Fri, 10 Sep 2021 15:47:19 -0400 Subject: [PATCH 11/11] fix many_sprites --- examples/2d/many_sprites.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/2d/many_sprites.rs b/examples/2d/many_sprites.rs index a3ca208a34734..e6c9b1521281e 100644 --- a/examples/2d/many_sprites.rs +++ b/examples/2d/many_sprites.rs @@ -75,7 +75,7 @@ fn setup( // System for rotating and translating the camera fn move_camera_system(time: Res