fj_core/layers/
objects.rs

1//! Layer infrastructure for [`Objects`]
2
3use crate::{
4    geometry::Geometry,
5    objects::{AboutToBeStored, AnyObject, Objects},
6    validation::Validation,
7};
8
9use super::{validation::ValidateObject, Command, Event, Layer};
10
11impl Layer<Objects> {
12    /// Insert an object into the stores
13    ///
14    /// Passes any events produced to the validation layer.
15    pub fn insert(
16        &mut self,
17        object: AnyObject<AboutToBeStored>,
18        geometry: &Geometry,
19        validation: &mut Layer<Validation>,
20    ) {
21        let mut events = Vec::new();
22        self.process(InsertObject { object }, &mut events);
23
24        for event in events {
25            let event = ValidateObject {
26                object: event.object.into(),
27                geometry,
28            };
29            validation.process(event, &mut Vec::new());
30        }
31    }
32}
33
34/// Insert an object into the stores
35#[derive(Clone, Debug)]
36pub struct InsertObject {
37    /// The object to insert
38    pub object: AnyObject<AboutToBeStored>,
39}
40
41impl Command<Objects> for InsertObject {
42    type Result = ();
43    type Event = InsertObject;
44
45    fn decide(self, _: &Objects, events: &mut Vec<Self::Event>) {
46        events.push(self);
47    }
48}
49
50impl Event<Objects> for InsertObject {
51    fn evolve(&self, state: &mut Objects) {
52        self.object.clone().insert(state);
53    }
54}