use sim_kernel::Result;
use sim_lib_stream_core::{
StreamCassette, StreamItem, StreamMetadata, StreamPacket, StreamStats, TransportProfile,
};
use crate::HostCallbackQueue;
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct HostCallbackCassette {
items: Vec<StreamItem>,
}
impl HostCallbackCassette {
pub fn new() -> Self {
Self::default()
}
pub fn from_items(items: Vec<StreamItem>) -> Self {
Self { items }
}
pub fn record_item(&mut self, item: StreamItem) {
self.items.push(item);
}
pub fn record_packet(&mut self, packet: StreamPacket) {
self.record_item(StreamItem::new(packet));
}
pub fn items(&self) -> &[StreamItem] {
&self.items
}
pub fn from_stream_cassette(cassette: &StreamCassette) -> Result<Self> {
Ok(Self {
items: cassette.items()?,
})
}
pub fn to_stream_cassette(
&self,
metadata: StreamMetadata,
profile: TransportProfile,
) -> Result<StreamCassette> {
StreamCassette::from_items(
metadata,
self.items.clone(),
profile,
StreamStats {
pushed: self.items.len() as u64,
accepted: self.items.len() as u64,
..StreamStats::default()
},
)
}
pub fn replay(&self, queue: &HostCallbackQueue) -> Result<()> {
for item in &self.items {
queue.callback_item(item.clone())?;
}
Ok(())
}
}