std_modrpc/role_impls/
property_observer.rs1use 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}