use std::sync::Arc;
use crate::core::io::ChannelInfo;
use crate::core::io::OutgoingFrame;
use crate::core::marker::Proxy;
use crate::core::node::CallbackApiInternal;
use crate::core::utils::Sealed;
use crate::protocol::FrameProcessor;
use crate::sync::node::FrameSender;
use crate::prelude::*;
#[derive(Clone, Debug)]
pub struct Callback<V: MaybeVersioned> {
channel_info: ChannelInfo,
sender: FrameSender<V, Proxy>,
}
impl<V: MaybeVersioned> Callback<V> {
pub(super) fn new(channel_info: ChannelInfo, sender: FrameSender<V, Proxy>) -> Self {
Self {
channel_info,
sender,
}
}
pub(in crate::sync) fn set_processor(&mut self, processor: Arc<FrameProcessor>) {
self.sender.set_processor(processor);
}
}
impl<V: MaybeVersioned> Sealed for Callback<V> {}
impl<V: MaybeVersioned> CallbackApiInternal<V> for Callback<V> {
unsafe fn send_internal(&self, frame: OutgoingFrame<V>) -> Result<()> {
self.sender.send_raw(frame).map_err(Error::from).map(|_| ())
}
fn process_frame(&self, frame: &Frame<V>) -> Result<Frame<V>> {
let mut frame = frame.clone();
self.sender.processor().process_outgoing(&mut frame)?;
Ok(frame)
}
}
impl<V: MaybeVersioned> CallbackApi<V> for Callback<V> {
fn info(&self) -> &ChannelInfo {
&self.channel_info
}
}
impl<V: MaybeVersioned> From<Callback<V>> for ChannelInfo {
fn from(value: Callback<V>) -> Self {
value.channel_info
}
}