standing_relations/core/context/
mod.rs

1mod handler_queue;
2pub mod input;
3mod tracking;
4
5use std::{cell::RefCell, rc::Rc};
6
7use self::handler_queue::{HandlerPosition, HandlerQueue, IsInputHandler};
8pub use self::tracking::{ContextTracker, TrackingIndex};
9
10#[derive(Default)]
11struct Context<'a> {
12    tracker: ContextTracker,
13    handler_queue: Rc<RefCell<HandlerQueue<'a>>>,
14}
15
16impl<'a> Context<'a> {
17    fn commit(&mut self) {
18        for mut x in self.handler_queue.borrow_mut().take_queued() {
19            x.dump()
20        }
21    }
22    fn handler_queue(&self) -> &Rc<RefCell<HandlerQueue<'a>>> {
23        &self.handler_queue
24    }
25    fn add_handler(&mut self, handler: impl IsInputHandler + 'a) -> HandlerPosition {
26        self.handler_queue.borrow_mut().add_handler(handler)
27    }
28}
29
30#[derive(Default)]
31pub struct CreationContext<'a>(Context<'a>);
32
33pub struct ExecutionContext<'a>(Context<'a>);
34
35impl<'a> CreationContext<'a> {
36    pub fn new() -> Self {
37        Default::default()
38    }
39    pub fn begin(self) -> ExecutionContext<'a> {
40        ExecutionContext(self.0)
41    }
42    pub fn tracker(&self) -> &ContextTracker {
43        &self.0.tracker
44    }
45}
46
47impl<'a> ExecutionContext<'a> {
48    pub fn commit(&mut self) {
49        self.0.commit()
50    }
51    pub fn tracker(&self) -> &ContextTracker {
52        &self.0.tracker
53    }
54}