hit_data/events/
on_field_set.rs1use 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}