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<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 })
80 .subscribe();
81 }
82}