std_modrpc/role_impls/
property_owner.rs

1use std::cell::RefCell;
2use std::rc::Rc;
3
4use crate::proto::{PropertyInitState, PropertyOwnerConfig};
5use modrpc::RoleSetup;
6
7struct State<T> {
8    hooks: crate::PropertyOwnerHooks<T>,
9    value: RefCell<T>,
10}
11
12#[derive(Clone)]
13pub struct PropertyOwner<T> {
14    state: Rc<State<T>>,
15}
16
17impl<T: mproto::Owned> PropertyOwner<T> {
18    pub async fn update(&mut self, new_value: T) {
19        self.state
20            .hooks
21            .update
22            .send(crate::PropertyUpdateGen {
23                new_value: &new_value,
24            })
25            .await;
26        *self.state.value.borrow_mut() = new_value;
27    }
28
29    pub fn with_value<R>(&self, f: impl FnOnce(&T) -> R) -> R {
30        f(&self.state.value.borrow())
31    }
32}
33
34impl<T: Copy> PropertyOwner<T> {
35    pub fn value(&self) -> T {
36        *self.state.value.borrow()
37    }
38}
39
40impl<T: Clone> PropertyOwner<T> {
41    pub fn value_cloned(&self) -> T {
42        let value_cell: &RefCell<T> = &self.state.value;
43        value_cell.clone().into_inner()
44    }
45}
46
47pub struct PropertyOwnerBuilder<T> {
48    stubs: crate::PropertyOwnerStubs<T>,
49    state: Rc<State<T>>,
50}
51
52impl<T: mproto::Owned + Clone> PropertyOwnerBuilder<T> {
53    pub fn new(
54        _name: &'static str,
55        hooks: crate::PropertyOwnerHooks<T>,
56        stubs: crate::PropertyOwnerStubs<T>,
57        _config: &PropertyOwnerConfig,
58        init: PropertyInitState<T>,
59    ) -> Self {
60        let state = Rc::new(State {
61            hooks,
62            value: RefCell::new(init.value.clone()),
63        });
64        Self { stubs, state }
65    }
66
67    pub fn create_handle(&self, _setup: &RoleSetup) -> crate::PropertyOwner<T> {
68        crate::PropertyOwner {
69            state: self.state.clone(),
70        }
71    }
72
73    pub fn build(self, setup: &RoleSetup) {
74        self.stubs
75            .update
76            .inline(setup, |_source, _update| {
77                // TODO set value with some policy for conflict resolution when there are multiple
78                // owners concurrently setting the value.
79            })
80            .subscribe();
81    }
82}