summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ecs/src/lib.rs21
-rw-r--r--ecs/src/sole.rs2
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(|_| {