diff options
-rw-r--r-- | ecs/src/lib.rs | 21 | ||||
-rw-r--r-- | ecs/src/sole.rs | 2 |
2 files changed, 10 insertions, 13 deletions
diff --git a/ecs/src/lib.rs b/ecs/src/lib.rs index 6f49a91..e9494a7 100644 --- a/ecs/src/lib.rs +++ b/ecs/src/lib.rs @@ -33,7 +33,7 @@ use crate::query::{ TermsBuilderInterface, MAX_TERM_CNT as QUERY_MAX_TERM_CNT, }; -use crate::sole::Sole; +use crate::sole::{Single, Sole}; use crate::stats::Stats; use crate::system::observer::{Observer, WrapperComponent as ObserverWrapperComponent}; use crate::system::{Callbacks, Metadata as SystemMetadata, System, SystemComponent}; @@ -212,6 +212,11 @@ impl World Some(EntityHandle::new(archetype, entity, self)) } + pub fn get_sole<SoleT: Sole>(&self) -> Option<Single<'_, SoleT>> + { + Some(Single::new(self.data.sole_storage.get::<SoleT>()?)) + } + pub fn event_submitter(&self) -> EventSubmitter<'_> { EventSubmitter::new(self) @@ -246,17 +251,9 @@ impl World return StepResult::Stop; } - let mut stats_lock = self - .data - .sole_storage - .get::<Stats>() - .expect("No stats sole found") - .write_nonblock() - .expect("Failed to aquire read-write stats sole lock"); - - let stats = stats_lock - .downcast_mut::<Stats>() - .expect("Casting stats sole to Stats type failed"); + let Some(mut stats) = self.get_sole::<Stats>() else { + unreachable!(); // Reason: is added in World::new + }; stats.current_tick += 1; diff --git a/ecs/src/sole.rs b/ecs/src/sole.rs index f148224..7cfcc24 100644 --- a/ecs/src/sole.rs +++ b/ecs/src/sole.rs @@ -64,7 +64,7 @@ where } } - fn new(sole: &'world Arc<Lock<Box<dyn Sole>>>) -> Self + pub(crate) fn new(sole: &'world Arc<Lock<Box<dyn Sole>>>) -> Self { Self { sole: sole.write_nonblock().unwrap_or_else(|_| { |