use std::task::Poll;
use super::hang::{Catalog, CatalogExt};
use super::{CatalogFormat, Stream};
#[non_exhaustive]
pub enum Consumer<E: CatalogExt = ()> {
#[doc(hidden)]
Hang(super::hang::Consumer<E>),
#[doc(hidden)]
Msf(super::msf::Consumer<E>),
}
impl<E: CatalogExt> Consumer<E> {
pub async fn new(broadcast: &moq_net::broadcast::Consumer, format: CatalogFormat) -> Result<Self, crate::Error> {
Ok(match format {
CatalogFormat::Hang => {
let track = broadcast
.track(hang::Catalog::DEFAULT_NAME)?
.subscribe(hang::Catalog::default_subscription())
.await?;
Self::Hang(super::hang::Consumer::new(track))
}
CatalogFormat::HangZ => {
let track = broadcast
.track(hang::Catalog::COMPRESSED_NAME)?
.subscribe(hang::Catalog::default_subscription())
.await?;
Self::Hang(super::hang::Consumer::compressed(track))
}
CatalogFormat::Msf => {
let track = broadcast.track(moq_msf::DEFAULT_NAME)?.subscribe(None).await?;
Self::Msf(super::msf::Consumer::new(track))
}
})
}
}
impl<E: CatalogExt> Stream for Consumer<E> {
type Ext = E;
fn poll_next(&mut self, waiter: &kio::Waiter) -> Poll<crate::Result<Option<Catalog<E>>>> {
match self {
Self::Hang(c) => c.poll_next(waiter),
Self::Msf(c) => c.poll_next(waiter),
}
}
}