dvb_subtitle/segments/
end_of_display_set.rs1use crate::error::{Error, Result};
4use broadcast_common::{Parse, Serialize};
5
6pub const SEGMENT_TYPE: u8 = 0x80;
8pub const HEADER_LEN: usize = 6;
10
11#[derive(Debug, Clone, PartialEq, Eq)]
13#[cfg_attr(feature = "serde", derive(serde::Serialize))]
14pub struct EndOfDisplaySetSegment {
15 pub page_id: u16,
17}
18
19impl<'a> Parse<'a> for EndOfDisplaySetSegment {
20 type Error = Error;
21
22 fn parse(bytes: &'a [u8]) -> Result<Self> {
23 if bytes.len() < HEADER_LEN {
24 return Err(Error::BufferTooShort {
25 need: HEADER_LEN,
26 have: bytes.len(),
27 what: "end_of_display_set_segment",
28 });
29 }
30 if bytes[1] != SEGMENT_TYPE {
31 return Err(Error::UnknownSegmentType(bytes[1]));
32 }
33 let page_id = u16::from_be_bytes([bytes[2], bytes[3]]);
34 let segment_length = u16::from_be_bytes([bytes[4], bytes[5]]);
35 if segment_length != 0 {
36 return Err(Error::SegmentTooLarge);
37 }
38 Ok(EndOfDisplaySetSegment { page_id })
39 }
40}
41
42impl Serialize for EndOfDisplaySetSegment {
43 type Error = Error;
44
45 fn serialized_len(&self) -> usize {
46 HEADER_LEN
47 }
48
49 fn serialize_into(&self, buf: &mut [u8]) -> core::result::Result<usize, Self::Error> {
50 let len = self.serialized_len();
51 if buf.len() < len {
52 return Err(Error::BufferTooShort {
53 need: len,
54 have: buf.len(),
55 what: "end_of_display_set_segment serialize",
56 });
57 }
58 buf[0] = 0x0F;
59 buf[1] = SEGMENT_TYPE;
60 buf[2..4].copy_from_slice(&self.page_id.to_be_bytes());
61 buf[4..6].copy_from_slice(&0u16.to_be_bytes()); Ok(len)
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use super::*;
69 use broadcast_common::{Parse, Serialize};
70
71 #[test]
72 fn round_trip() {
73 let bytes = [0x0F, 0x80, 0x00, 0x01, 0x00, 0x00];
74 let seg = EndOfDisplaySetSegment::parse(&bytes).unwrap();
75 assert_eq!(seg.page_id, 1);
76 let out = seg.to_bytes();
77 assert_eq!(out, bytes);
78
79 let mut seg2 = seg.clone();
81 seg2.page_id = 5;
82 let out2 = seg2.to_bytes();
83 assert_ne!(out2, bytes);
84 let reparse = EndOfDisplaySetSegment::parse(&out2).unwrap();
85 assert_eq!(reparse.page_id, 5);
86 }
87}