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<
31    T: mproto::Owned + Clone,
32> PropertyObserverBuilder<T> {
33    pub fn new(
34        _name: &'static str,
35        _hooks: crate::PropertyObserverHooks<T>,
36        stubs: crate::PropertyObserverStubs<T>,
37        _config: &PropertyObserverConfig,
38        init: PropertyInitState<T>,
39    ) -> Self {
40        let value = Rc::new(RefCell::new(init.value.clone()));
41        Self {
42            stubs,
43            value,
44        }
45    }
46
47    pub fn create_handle(
48        &self,
49        _setup: &RoleSetup,
50    ) -> crate::PropertyObserver<T> {
51        crate::PropertyObserver {
52            value: self.value.clone(),
53        }
54    }
55
56    pub fn build(
57        self,
58        setup: &RoleSetup,
59    ) {
60        let value = self.value.clone();
61        self.stubs.update
62            .inline(setup, move |_source, update| {
63                *value.borrow_mut() = update.new_value;
64            })
65            .subscribe();
66    }
67}