std_modrpc/role_impls/
property_observer.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3
4use crate::proto::{PropertyInitState, PropertyObserverConfig};
5use modrpc::RoleSetup;
6
7#[derive(Clone)]
8pub struct PropertyObserver<T> {
9    value: Rc<RefCell<T>>,
10}
11
12impl<T: Copy> PropertyObserver<T> {
13    pub fn value(&self) -> T {
14        *self.value.borrow()
15    }
16}
17
18impl<T: Clone> PropertyObserver<T> {
19    pub fn value_cloned(&self) -> T {
20        let value_cell: &RefCell<T> = &*(self.value);
21        value_cell.clone().into_inner()
22    }
23}
24
25pub struct PropertyObserverBuilder<T> {
26    stubs: crate::PropertyObserverStubs<T>,
27    value: Rc<RefCell<T>>,
28}
29
30impl<T: mproto::Owned + Clone> PropertyObserverBuilder<T> {
31    pub fn new(
32        _name: &'static str,
33        _hooks: crate::PropertyObserverHooks<T>,
34        stubs: crate::PropertyObserverStubs<T>,
35        _config: &PropertyObserverConfig,
36        init: PropertyInitState<T>,
37    ) -> Self {
38        let value = Rc::new(RefCell::new(init.value.clone()));
39        Self { stubs, value }
40    }
41
42    pub fn create_handle(&self, _setup: &RoleSetup) -> crate::PropertyObserver<T> {
43        crate::PropertyObserver {
44            value: self.value.clone(),
45        }
46    }
47
48    pub fn build(self, setup: &RoleSetup) {
49        let value = self.value.clone();
50        self.stubs
51            .update
52            .inline(setup, move |_source, update| {
53                *value.borrow_mut() = update.new_value;
54            })
55            .subscribe();
56    }
57}