use crate::descriptors::DescriptorRegistry;
use crate::tables::nit;
use super::{CompleteSectionSet, ParsedDescriptorLoop};
#[derive(Debug)]
#[non_exhaustive]
pub struct CompleteNitTransportStream<'a> {
pub transport_stream_id: u16,
pub original_network_id: u16,
pub descriptors: ParsedDescriptorLoop<'a>,
}
#[derive(Debug)]
#[non_exhaustive]
pub struct CompleteNit<'a> {
pub kind: nit::NitKind,
pub network_id: u16,
pub version_number: u8,
pub current_next_indicator: bool,
pub network_descriptors: ParsedDescriptorLoop<'a>,
pub transport_streams: Vec<CompleteNitTransportStream<'a>>,
}
impl<'a> CompleteNit<'a> {
pub(crate) fn parse(
set: &'a CompleteSectionSet,
registry: Option<&'a DescriptorRegistry>,
) -> crate::Result<Self> {
let sections: Vec<nit::NitSection<'a>> = set.parse_sections()?;
let first = sections.first().ok_or(crate::Error::BufferTooShort {
need: 1,
have: 0,
what: "CompleteNit sections",
})?;
let mut transport_streams = Vec::new();
for section in §ions {
transport_streams.extend(section.transport_streams.iter().map(|ts| {
CompleteNitTransportStream {
transport_stream_id: ts.transport_stream_id,
original_network_id: ts.original_network_id,
descriptors: ParsedDescriptorLoop::parse(ts.descriptors, registry),
}
}));
}
Ok(Self {
kind: first.kind,
network_id: first.network_id,
version_number: first.version_number,
current_next_indicator: first.current_next_indicator,
network_descriptors: ParsedDescriptorLoop::parse(first.network_descriptors, registry),
transport_streams,
})
}
}