From ef7b76ff39d501028852835649f618fcbe17a003 Mon Sep 17 00:00:00 2001 From: HampusM Date: Sat, 13 Apr 2024 17:38:45 +0200 Subject: feat(ecs): add extensions --- ecs/src/extension.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 ecs/src/extension.rs (limited to 'ecs/src/extension.rs') 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(&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(&mut self, sole: SoleT) -> Result<(), SoleAlreadyExistsError> + where + SoleT: Sole, + { + self.world.add_sole(sole) + } +} -- cgit v1.2.3-18-g5258