hit_data/events/
on_field_set.rs

1use crate::HitError;
2use std::cell::RefCell;
3use std::collections::HashMap;
4use std::rc::Rc;
5
6#[derive(Clone)]
7pub struct Listeners<T>(HashMap<String, Vec<FieldListenerRef<T>>>);
8
9impl<T> Listeners<T> {
10    pub fn new() -> Self {
11        Listeners(HashMap::new())
12    }
13
14    fn get_or_create_property_listeners(
15        &mut self,
16        property: &str,
17    ) -> &mut Vec<FieldListenerRef<T>> {
18        self.0.entry(property.to_string()).or_insert(vec![])
19    }
20
21    fn get_property_listeners_mut(
22        &mut self,
23        property: &str,
24    ) -> Option<&mut Vec<FieldListenerRef<T>>> {
25        self.0.get_mut(property)
26    }
27
28    pub fn insert(&mut self, property: &str, value: FieldListenerRef<T>) {
29        let listeners = self.get_or_create_property_listeners(property);
30        listeners.push(value);
31    }
32
33    pub fn remove(&mut self, property: &str, listener_id: &str) -> Result<(), HitError> {
34        let listeners = self
35            .get_property_listeners_mut(property)
36            .ok_or(HitError::ListenerNotFound(listener_id.to_string()))?;
37        listeners.retain(|listener2| listener2.borrow().get_unique_id() != listener_id);
38        Ok(())
39    }
40
41    pub fn dispatch_value(&mut self, property: &str, value: &T) {
42        match self.get_property_listeners_mut(property) {
43            Some(listeners) => {
44                for listener in listeners.iter_mut() {
45                    listener.borrow_mut().on_update(value);
46                }
47            }
48            None => {}
49        }
50    }
51}
52
53pub type FieldListenerRef<T> = Rc<RefCell<dyn FieldListener<T>>>;
54
55pub trait FieldListener<T> {
56    fn on_update(&mut self, value: &T);
57    fn get_unique_id(&self) -> &str;
58}