use serde::{Deserialize, Serialize};
use crate::{
RemoteSend, codec,
rch::{mpsc, oneshot, watch},
};
#[derive(Debug, Serialize, Deserialize)]
#[serde(bound(serialize = "T: RemoteSend, Codec: codec::Codec"))]
#[serde(bound(deserialize = "T: RemoteSend, Codec: codec::Codec"))]
pub struct ReadRequest<T, Codec> {
pub(crate) value_tx: oneshot::Sender<Value<T, Codec>, Codec>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(bound(serialize = "T: RemoteSend, Codec: codec::Codec"))]
#[serde(bound(deserialize = "T: RemoteSend, Codec: codec::Codec"))]
pub struct WriteRequest<T, Codec> {
pub(crate) value_tx: oneshot::Sender<T, Codec>,
pub(crate) new_value_rx: oneshot::Receiver<T, Codec>,
pub(crate) confirm_tx: oneshot::Sender<(), Codec>,
}
#[derive(Clone, Serialize, Deserialize)]
#[serde(bound(serialize = "T: RemoteSend, Codec: codec::Codec"))]
#[serde(bound(deserialize = "T: RemoteSend, Codec: codec::Codec"))]
pub struct Value<T, Codec> {
pub(crate) value: T,
pub(crate) dropped_tx: mpsc::Sender<(), Codec, 1>,
pub(crate) invalid_rx: watch::Receiver<bool, Codec>,
}
impl<T, Codec> Value<T, Codec>
where
T: RemoteSend,
Codec: codec::Codec,
{
pub(crate) fn is_valid(&self) -> bool {
if self.dropped_tx.is_closed() {
return false;
}
match self.invalid_rx.borrow() {
Ok(invalid) if !*invalid => (),
_ => return false,
}
true
}
}