summaryrefslogtreecommitdiff
path: root/ecs/src
diff options
context:
space:
mode:
authorHampusM <hampus@hampusmat.com>2024-04-13 17:38:45 +0200
committerHampusM <hampus@hampusmat.com>2024-04-13 17:38:45 +0200
commitef7b76ff39d501028852835649f618fcbe17a003 (patch)
tree00cf4966c1bcfa0812f436a793a1711867869601 /ecs/src
parentf2120591b0051d4239de73960709248456e884e7 (diff)
feat(ecs): add extensions
Diffstat (limited to 'ecs/src')
-rw-r--r--ecs/src/extension.rs56
-rw-r--r--ecs/src/lib.rs13
2 files changed, 69 insertions, 0 deletions
diff --git a/ecs/src/extension.rs b/ecs/src/extension.rs
new file mode 100644
index 0000000..fc5a345
--- /dev/null
+++ b/ecs/src/extension.rs
@@ -0,0 +1,56 @@
+use crate::component::Sequence as ComponentSequence;
+use crate::event::Event;
+use crate::sole::Sole;
+use crate::system::System;
+use crate::{SoleAlreadyExistsError, World};
+
+/// A collection of systems, entities & soles that can be added to a [`World`].
+pub trait Extension
+{
+ fn collect(self, collector: Collector<'_>);
+}
+
+/// Passed to a [`Extension`] to collects it's systems, entities & soles.
+pub struct Collector<'world>
+{
+ world: &'world mut World,
+}
+
+impl<'world> Collector<'world>
+{
+ /// Returns a new `Collector` for the given [`World`].
+ pub fn new(world: &'world mut World) -> Self
+ {
+ Self { world }
+ }
+
+ /// Adds a system to the [`World`].
+ pub fn add_system<'this, EventT, SystemImpl>(
+ &'this mut self,
+ event: EventT,
+ system: impl System<'this, SystemImpl>,
+ ) where
+ EventT: Event,
+ {
+ self.world.register_system(event, system);
+ }
+
+ /// Adds a entity to the [`World`].
+ pub fn add_entity<Comps>(&mut self, components: Comps)
+ where
+ Comps: ComponentSequence,
+ {
+ self.world.create_entity(components);
+ }
+
+ /// Adds a globally shared singleton value to the [`World`].
+ ///
+ /// # Errors
+ /// Returns `Err` if this [`Sole`] has already been added.
+ pub fn add_sole<SoleT>(&mut self, sole: SoleT) -> Result<(), SoleAlreadyExistsError>
+ where
+ SoleT: Sole,
+ {
+ self.world.add_sole(sole)
+ }
+}
diff --git a/ecs/src/lib.rs b/ecs/src/lib.rs
index 285f3b3..009ff21 100644
--- a/ecs/src/lib.rs
+++ b/ecs/src/lib.rs
@@ -12,6 +12,7 @@ use std::vec::Drain;
use crate::actions::Action;
use crate::component::{Component, Sequence as ComponentSequence};
use crate::event::{Event, Id as EventId, Ids, Sequence as EventSequence};
+use crate::extension::{Collector as ExtensionCollector, Extension};
use crate::lock::Lock;
use crate::sole::Sole;
use crate::system::{System, TypeErased as TypeErasedSystem};
@@ -20,6 +21,7 @@ use crate::type_name::TypeName;
pub mod actions;
pub mod component;
pub mod event;
+pub mod extension;
pub mod lock;
pub mod query;
pub mod sole;
@@ -120,6 +122,17 @@ impl World
drop(event);
}
+ /// Adds a extensions.
+ ///
+ /// # Panics
+ /// Will panic if mutable internal lock cannot be acquired.
+ pub fn add_extension(&mut self, extension: impl Extension)
+ {
+ let extension_collector = ExtensionCollector::new(self);
+
+ extension.collect(extension_collector);
+ }
+
/// Emits a event, running all systems listening to the event for each compatible
/// entity.
///