use std::task::Poll;
use hang::Catalog;
use crate::Result;
#[derive(Clone)]
pub struct Consumer {
pub track: moq_lite::TrackConsumer,
group: Option<moq_lite::GroupConsumer>,
}
impl Consumer {
pub fn new(track: moq_lite::TrackConsumer) -> Self {
Self { track, group: None }
}
pub fn poll_next(&mut self, waiter: &conducer::Waiter) -> Poll<Result<Option<Catalog>>> {
while let Poll::Ready(group) = self.track.poll_next_group(waiter)? {
self.group = group;
if self.group.is_none() {
return Poll::Ready(Ok(None));
}
}
let Some(group) = &mut self.group else {
return Poll::Pending;
};
if let Poll::Ready(Some(frame)) = group.poll_read_frame(waiter)? {
self.group.take();
let catalog = Catalog::from_slice(&frame)?;
Poll::Ready(Ok(Some(catalog)))
} else {
self.group.take();
Poll::Pending
}
}
pub async fn next(&mut self) -> Result<Option<Catalog>> {
conducer::wait(|waiter| self.poll_next(waiter)).await
}
}
impl From<moq_lite::TrackConsumer> for Consumer {
fn from(inner: moq_lite::TrackConsumer) -> Self {
Self::new(inner)
}
}