use super::{AppendReceipt, AppendReply, BatchAppendReply, StoreError};
struct Ticket<T> {
rx: flume::Receiver<Result<T, StoreError>>,
}
impl<T> Ticket<T> {
fn new(rx: flume::Receiver<Result<T, StoreError>>) -> Self {
Self { rx }
}
fn wait(self) -> Result<T, StoreError> {
crate::store::recv_writer_reply(&self.rx)
}
fn try_check(&self) -> Option<Result<T, StoreError>> {
match self.rx.try_recv() {
Ok(value) => Some(value),
Err(flume::TryRecvError::Disconnected) => Some(Err(StoreError::WriterCrashed)),
Err(flume::TryRecvError::Empty) => None,
}
}
fn receiver(&self) -> &flume::Receiver<Result<T, StoreError>> {
&self.rx
}
}
pub struct AppendTicket {
inner: Ticket<AppendReceipt>,
}
impl AppendTicket {
pub(crate) fn new(rx: flume::Receiver<AppendReply>) -> Self {
Self {
inner: Ticket::new(rx),
}
}
pub fn wait(self) -> AppendReply {
self.inner.wait()
}
pub fn try_check(&self) -> Option<AppendReply> {
self.inner.try_check()
}
pub fn receiver(&self) -> &flume::Receiver<AppendReply> {
self.inner.receiver()
}
}
pub struct BatchAppendTicket {
inner: Ticket<Vec<AppendReceipt>>,
}
impl BatchAppendTicket {
pub(crate) fn new(rx: flume::Receiver<BatchAppendReply>) -> Self {
Self {
inner: Ticket::new(rx),
}
}
pub fn wait(self) -> BatchAppendReply {
self.inner.wait()
}
pub fn try_check(&self) -> Option<BatchAppendReply> {
self.inner.try_check()
}
pub fn receiver(&self) -> &flume::Receiver<BatchAppendReply> {
self.inner.receiver()
}
}