use crate::{crypto::DetachedKey, wire::Encodable};
use async_std::sync::Arc;
use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize, Serializer};
use std::task::Waker;
use std::{
fmt::Debug,
ops::{Deref, DerefMut},
};
#[derive(Clone, Debug, Default)]
pub(crate) struct Notify<T> {
inner: T,
waker: Option<Waker>,
}
impl<T> Deref for Notify<T>
where
T: DeserializeOwned + Serialize,
{
type Target = T;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<T> DerefMut for Notify<T>
where
T: Encodable,
{
fn deref_mut(&mut self) -> &mut Self::Target {
self.waker.as_ref().map(|w| w.wake_by_ref());
&mut self.inner
}
}
impl<T> Notify<T>
where
T: Encodable,
{
pub(crate) fn new(inner: T) -> Self {
Self { inner, waker: None }
}
#[allow(unused)]
pub(crate) fn setup(ptr: &mut Notify<T>, waker: &Waker) {
ptr.waker.replace(waker.clone());
}
pub fn notify(ptr: &Notify<T>) {
ptr.waker.as_ref().map(|w| w.wake_by_ref());
}
}
impl<K, T> DetachedKey<K> for Notify<T>
where
T: Encodable + DetachedKey<K>,
{
fn key(&self) -> Option<Arc<K>> {
self.inner.key()
}
}
impl<T> Serialize for Notify<T>
where
T: Encodable,
{
fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
self.inner.serialize(ser)
}
}
impl<'de, T> Deserialize<'de> for Notify<T>
where
T: Encodable,
{
fn deserialize<D>(de: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
T::deserialize(de).map(|inner| Self { inner, waker: None })
}
}