zbus/object_server/interface/
interface_deref.rs

1use std::{
2    marker::PhantomData,
3    ops::{Deref, DerefMut},
4};
5
6use crate::async_lock::{RwLockReadGuard, RwLockWriteGuard};
7
8use super::Interface;
9
10/// Opaque structure that derefs to an `Interface` type.
11pub 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
27/// Opaque structure that mutably derefs to an `Interface` type.
28pub 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}