use crate::descriptors::DescriptorRegistry;
use crate::tables::sdt;
use super::{CompleteSectionSet, ParsedDescriptorLoop};
#[derive(Debug)]
#[non_exhaustive]
pub struct CompleteSdtService<'a> {
pub service_id: u16,
pub eit_schedule_flag: bool,
pub eit_present_following_flag: bool,
pub running_status: u8,
pub free_ca_mode: bool,
pub descriptors: ParsedDescriptorLoop<'a>,
}
#[derive(Debug)]
#[non_exhaustive]
pub struct CompleteSdt<'a> {
pub kind: sdt::SdtKind,
pub transport_stream_id: u16,
pub version_number: u8,
pub current_next_indicator: bool,
pub original_network_id: u16,
pub services: Vec<CompleteSdtService<'a>>,
}
impl<'a> CompleteSdt<'a> {
pub(crate) fn parse(
set: &'a CompleteSectionSet,
registry: Option<&'a DescriptorRegistry>,
) -> crate::Result<Self> {
let sections: Vec<sdt::SdtSection<'a>> = set.parse_sections()?;
let first = sections.first().ok_or(crate::Error::BufferTooShort {
need: 1,
have: 0,
what: "CompleteSdt sections",
})?;
let mut services = Vec::new();
for section in §ions {
services.extend(section.services.iter().map(|svc| CompleteSdtService {
service_id: svc.service_id,
eit_schedule_flag: svc.eit_schedule_flag,
eit_present_following_flag: svc.eit_present_following_flag,
running_status: svc.running_status,
free_ca_mode: svc.free_ca_mode,
descriptors: ParsedDescriptorLoop::parse(svc.descriptors, registry),
}));
}
Ok(Self {
kind: first.kind,
transport_stream_id: first.transport_stream_id,
version_number: first.version_number,
current_next_indicator: first.current_next_indicator,
original_network_id: first.original_network_id,
services,
})
}
}