use crossbeam::channel::{Receiver, Sender, bounded};
use serde::{Deserialize, Serialize};
#[derive(Debug)]
#[non_exhaustive]
pub enum Msg {
Bool(bool),
Val(f64),
Arr(Vec<f64>),
Str(String),
Packet(Vec<u8>),
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct Channel {
#[serde(skip)]
ch0: ChannelInner,
#[serde(skip)]
ch1: ChannelInner,
}
impl Channel {
pub fn new() -> Self {
Self::default()
}
pub fn source_endpoint(&self) -> Endpoint {
Endpoint::new(self.ch0.tx.clone(), self.ch1.rx.clone())
}
pub fn sink_endpoint(&self) -> Endpoint {
Endpoint::new(self.ch1.tx.clone(), self.ch0.rx.clone())
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct Endpoint {
#[serde(skip)]
ch: ChannelInner,
}
impl Endpoint {
pub fn new(tx: Sender<Msg>, rx: Receiver<Msg>) -> Self {
Self {
ch: ChannelInner::from_handles(tx, rx),
}
}
pub fn tx(&self) -> &Sender<Msg> {
&self.ch.tx
}
pub fn rx(&self) -> &Receiver<Msg> {
&self.ch.rx
}
}
#[derive(Clone, Debug)]
struct ChannelInner {
tx: Sender<Msg>,
rx: Receiver<Msg>,
}
impl ChannelInner {
fn from_handles(tx: Sender<Msg>, rx: Receiver<Msg>) -> Self {
Self { tx, rx }
}
}
impl Default for ChannelInner {
fn default() -> Self {
let (tx, rx) = bounded(10);
Self { tx, rx }
}
}