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<
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}