zbus/object_server/interface/
interface_deref.rs1use std::{
2 marker::PhantomData,
3 ops::{Deref, DerefMut},
4};
5
6use crate::async_lock::{RwLockReadGuard, RwLockWriteGuard};
7
8use super::Interface;
9
10pub struct InterfaceDeref<'d, I> {
12 pub(super) iface: RwLockReadGuard<'d, dyn Interface>,
13 pub(super) phantom: PhantomData<I>,
14}
15
16impl<I> Deref for InterfaceDeref<'_, I>
17where
18 I: Interface,
19{
20 type Target = I;
21
22 fn deref(&self) -> &I {
23 self.iface.downcast_ref::<I>().unwrap()
24 }
25}
26
27pub struct InterfaceDerefMut<'d, I> {
29 pub(super) iface: RwLockWriteGuard<'d, dyn Interface>,
30 pub(super) phantom: PhantomData<I>,
31}
32
33impl<I> Deref for InterfaceDerefMut<'_, I>
34where
35 I: Interface,
36{
37 type Target = I;
38
39 fn deref(&self) -> &I {
40 self.iface.downcast_ref::<I>().unwrap()
41 }
42}
43
44impl<I> DerefMut for InterfaceDerefMut<'_, I>
45where
46 I: Interface,
47{
48 fn deref_mut(&mut self) -> &mut Self::Target {
49 self.iface.downcast_mut::<I>().unwrap()
50 }
51}