use futures::channel::mpsc::Receiver;
use futures::stream::StreamExt;
use pipecrab_core::{DataFrame, Direction, SystemFrame};
#[derive(Debug)]
pub enum Received {
Sys(Direction, SystemFrame),
Data(DataFrame),
}
pub struct Inbound {
pub sys: Receiver<(Direction, SystemFrame)>,
pub data: Receiver<DataFrame>,
}
impl Inbound {
pub async fn recv(&mut self) -> Option<Received> {
loop {
futures::select_biased! {
sys = self.sys.next() => {
if let Some((dir, f)) = sys {
return Some(Received::Sys(dir, f));
}
}
data = self.data.next() => {
if let Some(f) = data {
return Some(Received::Data(f));
}
}
complete => return None,
}
}
}
pub fn flush_data(&mut self) -> Vec<DataFrame> {
let mut kept = Vec::new();
while let Ok(frame) = self.data.try_recv() {
if frame.survives_flush() {
kept.push(frame);
}
}
kept
}
}