1use crate::descriptors::DescriptorRegistry;
2use crate::tables::nit;
3use alloc::vec::Vec;
4
5use super::{CompleteSectionSet, CompleteTransportStream, ParsedDescriptorLoop};
6
7#[derive(Debug)]
9#[non_exhaustive]
10pub struct CompleteNit<'a> {
11 pub kind: nit::NitKind,
13 pub network_id: u16,
15 pub version_number: u8,
17 pub current_next_indicator: bool,
19 pub network_descriptors: ParsedDescriptorLoop<'a>,
24 pub transport_streams: Vec<CompleteTransportStream<'a>>,
26}
27
28impl<'a> CompleteNit<'a> {
29 pub(crate) fn parse(
30 set: &'a CompleteSectionSet,
31 registry: Option<&'a DescriptorRegistry>,
32 ) -> crate::Result<Self> {
33 let sections: Vec<nit::NitSection<'a>> = set.parse_sections()?;
34 let first = sections.first().ok_or(crate::Error::BufferTooShort(
35 broadcast_common::error::BufferTooShort {
36 need: 1,
37 have: 0,
38 what: "CompleteNit sections",
39 },
40 ))?;
41 let transport_streams = CompleteTransportStream::collect(
42 sections.iter().flat_map(|section| {
43 section.transport_streams.iter().map(|ts| {
44 (
45 ts.transport_stream_id,
46 ts.original_network_id,
47 ts.descriptors,
48 )
49 })
50 }),
51 registry,
52 );
53 Ok(Self {
54 kind: first.kind,
55 network_id: first.network_id,
56 version_number: first.version_number,
57 current_next_indicator: first.current_next_indicator,
58 network_descriptors: ParsedDescriptorLoop::parse_all(
59 sections.iter().map(|section| section.network_descriptors),
60 registry,
61 ),
62 transport_streams,
63 })
64 }
65}