std_modrpc/role_impls/
property_owner.rs1use 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 })
80 .subscribe();
81 }
82}