use crate::descriptors::DescriptorRegistry;
use crate::tables::nit;
use alloc::vec::Vec;
use super::{CompleteSectionSet, CompleteTransportStream, ParsedDescriptorLoop};
#[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<CompleteTransportStream<'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(
broadcast_common::error::BufferTooShort {
need: 1,
have: 0,
what: "CompleteNit sections",
},
))?;
let transport_streams = CompleteTransportStream::collect(
sections.iter().flat_map(|section| {
section.transport_streams.iter().map(|ts| {
(
ts.transport_stream_id,
ts.original_network_id,
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_all(
sections.iter().map(|section| section.network_descriptors),
registry,
),
transport_streams,
})
}
}