diff options
Diffstat (limited to 'ecs/src/extension.rs')
-rw-r--r-- | ecs/src/extension.rs | 56 |
1 files changed, 56 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) + } +} |