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<
18    T: mproto::Owned,
19> PropertyOwner<T> {
20    pub async fn update(&mut self, new_value: T) {
21        self.state.hooks.update.send(crate::PropertyUpdateGen { new_value: &new_value }).await;
22        *self.state.value.borrow_mut() = new_value;
23    }
24
25    pub fn with_value<R>(&self, f: impl FnOnce(&T) -> R) -> R {
26        f(&self.state.value.borrow())
27    }
28}
29
30impl<T: Copy> PropertyOwner<T> {
31    pub fn value(&self) -> T {
32        *self.state.value.borrow()
33    }
34}
35
36impl<T: Clone> PropertyOwner<T> {
37    pub fn value_cloned(&self) -> T {
38        let value_cell: &RefCell<T> = &self.state.value;
39        value_cell.clone().into_inner()
40    }
41}
42
43pub struct PropertyOwnerBuilder<T> {
44    stubs: crate::PropertyOwnerStubs<T>,
45    state: Rc<State<T>>,
46}
47
48impl<
49    T: mproto::Owned + Clone,
50> PropertyOwnerBuilder<T> {
51    pub fn new(
52        _name: &'static str,
53        hooks: crate::PropertyOwnerHooks<T>,
54        stubs: crate::PropertyOwnerStubs<T>,
55        _config: &PropertyOwnerConfig,
56        init: PropertyInitState<T>,
57    ) -> Self {
58        let state = Rc::new(State {
59            hooks,
60            value: RefCell::new(init.value.clone()),
61        });
62        Self { stubs, state }
63    }
64
65    pub fn create_handle(
66        &self,
67        _setup: &RoleSetup,
68    ) -> crate::PropertyOwner<T> {
69        crate::PropertyOwner { state: self.state.clone() }
70    }
71
72    pub fn build(
73        self,
74        setup: &RoleSetup,
75    ) {
76        self.stubs.update.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}