1use crate::descriptors::DescriptorRegistry;
2use crate::tables::nit;
3use alloc::vec::Vec;
4
5use super::{CompleteSectionSet, ParsedDescriptorLoop};
6
7#[derive(Debug)]
9#[non_exhaustive]
10pub struct CompleteNitTransportStream<'a> {
11 pub transport_stream_id: u16,
13 pub original_network_id: u16,
15 pub descriptors: ParsedDescriptorLoop<'a>,
17}
18
19#[derive(Debug)]
21#[non_exhaustive]
22pub struct CompleteNit<'a> {
23 pub kind: nit::NitKind,
25 pub network_id: u16,
27 pub version_number: u8,
29 pub current_next_indicator: bool,
31 pub network_descriptors: ParsedDescriptorLoop<'a>,
33 pub transport_streams: Vec<CompleteNitTransportStream<'a>>,
35}
36
37impl<'a> CompleteNit<'a> {
38 pub(crate) fn parse(
39 set: &'a CompleteSectionSet,
40 registry: Option<&'a DescriptorRegistry>,
41 ) -> crate::Result<Self> {
42 let sections: Vec<nit::NitSection<'a>> = set.parse_sections()?;
43 let first = sections.first().ok_or(crate::Error::BufferTooShort {
44 need: 1,
45 have: 0,
46 what: "CompleteNit sections",
47 })?;
48 let mut transport_streams = Vec::new();
49 for section in §ions {
50 transport_streams.extend(section.transport_streams.iter().map(|ts| {
51 CompleteNitTransportStream {
52 transport_stream_id: ts.transport_stream_id,
53 original_network_id: ts.original_network_id,
54 descriptors: ParsedDescriptorLoop::parse(ts.descriptors, registry),
55 }
56 }));
57 }
58 Ok(Self {
59 kind: first.kind,
60 network_id: first.network_id,
61 version_number: first.version_number,
62 current_next_indicator: first.current_next_indicator,
63 network_descriptors: ParsedDescriptorLoop::parse(first.network_descriptors, registry),
67 transport_streams,
68 })
69 }
70}