mod types;
pub use types::*;
use std::collections::HashSet;
impl StreamSink {
pub fn new(modes: impl IntoIterator<Item = StreamMode>) -> Self {
Self {
active_modes: modes.into_iter().collect(),
buffer: std::cell::RefCell::new(Vec::new()),
}
}
pub fn all() -> Self {
Self::new([
StreamMode::Values,
StreamMode::Updates,
StreamMode::Messages,
StreamMode::Debug,
StreamMode::Interrupts,
StreamMode::Custom,
])
}
pub fn is_active(&self, mode: StreamMode) -> bool {
self.active_modes.contains(&mode)
}
pub fn active_modes(&self) -> &HashSet<StreamMode> {
&self.active_modes
}
pub fn enable(&mut self, mode: StreamMode) {
self.active_modes.insert(mode);
}
pub fn disable(&mut self, mode: StreamMode) {
self.active_modes.remove(&mode);
}
pub fn push(&self, chunk: StreamChunk) {
if self.active_modes.contains(&chunk.mode()) {
self.buffer.borrow_mut().push(chunk);
}
}
pub fn drain(&self) -> Vec<StreamChunk> {
self.buffer.borrow_mut().drain(..).collect()
}
pub fn len(&self) -> usize {
self.buffer.borrow().len()
}
pub fn is_empty(&self) -> bool {
self.buffer.borrow().is_empty()
}
pub fn peek(&self) -> Vec<StreamChunk> {
self.buffer.borrow().clone()
}
}
pub fn stream(chunks: &[StreamChunk], modes: &[StreamMode]) -> Vec<StreamChunk> {
let mode_set: HashSet<StreamMode> = modes.iter().copied().collect();
chunks
.iter()
.filter(|c| mode_set.contains(&c.mode()))
.cloned()
.collect()
}
#[cfg(test)]
#[cfg(test)]
mod test;