use crate::error::Error;
use crate::json::{Patch, Value};
use crate::result::Result;
use crate::sync::Sender;
#[derive(Clone)]
pub struct Channel {
sender: Option<Sender<(Patch, Option<Value>)>>,
}
impl std::fmt::Debug for Channel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Channel")
.field(
"sender",
if self.sender.is_some() {
&"attached"
} else {
&"detached"
},
)
.finish()
}
}
impl Channel {
pub fn is_detached(&self) -> bool {
self.sender.is_none()
}
pub fn detached() -> Self {
Self { sender: None }
}
pub async fn send(&self, changes: Patch) -> Result<()> {
if let Some(sender) = self.sender.as_ref() {
sender
.send((changes, None))
.await
.map_err(Error::internal)?;
}
Ok(())
}
pub async fn send_and_commit(&self, changes: Patch, checkpoint: Value) -> Result<()> {
if let Some(sender) = self.sender.as_ref() {
sender
.send((changes, Some(checkpoint)))
.await
.map_err(Error::internal)?;
}
Ok(())
}
}
impl From<Sender<(Patch, Option<Value>)>> for Channel {
fn from(sender: Sender<(Patch, Option<Value>)>) -> Self {
Self {
sender: Some(sender),
}
}
}