dvb_si/descriptors/
network_name.rs1use crate::error::{Error, Result};
4use crate::traits::Descriptor;
5use dvb_common::{Parse, Serialize};
6
7pub const TAG: u8 = 0x40;
9
10pub const HEADER_LEN: usize = 2;
12
13#[derive(Debug, Clone, PartialEq, Eq)]
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17pub struct NetworkNameDescriptor<'a> {
18 #[cfg_attr(feature = "serde", serde(borrow))]
21 pub network_name: &'a [u8],
22}
23
24impl<'a> Parse<'a> for NetworkNameDescriptor<'a> {
25 type Error = crate::error::Error;
26 fn parse(bytes: &'a [u8]) -> Result<Self> {
27 if bytes.len() < HEADER_LEN {
28 return Err(Error::BufferTooShort {
29 need: HEADER_LEN,
30 have: bytes.len(),
31 what: "network name descriptor header",
32 });
33 }
34
35 let tag = bytes[0];
36 if tag != TAG {
37 return Err(Error::InvalidDescriptor {
38 tag,
39 reason: "expected tag 0x40",
40 });
41 }
42
43 let length = bytes[1] as usize;
44 let total = HEADER_LEN + length;
45
46 if bytes.len() < total {
47 return Err(Error::BufferTooShort {
48 need: total,
49 have: bytes.len(),
50 what: "network name descriptor payload",
51 });
52 }
53
54 Ok(NetworkNameDescriptor {
55 network_name: &bytes[HEADER_LEN..total],
56 })
57 }
58}
59
60impl Serialize for NetworkNameDescriptor<'_> {
61 type Error = crate::error::Error;
62 fn serialized_len(&self) -> usize {
63 HEADER_LEN + self.network_name.len()
64 }
65
66 fn serialize_into(&self, buf: &mut [u8]) -> Result<usize> {
67 let need = self.serialized_len();
68 if buf.len() < need {
69 return Err(Error::OutputBufferTooSmall {
70 need,
71 have: buf.len(),
72 });
73 }
74
75 buf[0] = TAG;
76 buf[1] = self.network_name.len() as u8;
77 buf[HEADER_LEN..need].copy_from_slice(self.network_name);
78
79 Ok(need)
80 }
81}
82
83impl<'a> Descriptor<'a> for NetworkNameDescriptor<'a> {
84 const TAG: u8 = 0x40;
85
86 fn descriptor_length(&self) -> u8 {
87 self.network_name.len() as u8
88 }
89}
90
91#[cfg(test)]
92mod tests {
93 use super::*;
94
95 #[test]
97 fn parse_extracts_network_name() {
98 let raw: Vec<u8> = vec![
99 TAG,
100 0x04, b'E',
102 b'U',
103 b'T',
104 b'E',
105 ];
106 let desc = NetworkNameDescriptor::parse(&raw).unwrap();
107 assert_eq!(desc.network_name, b"EUTE");
108 }
109
110 #[test]
112 fn parse_rejects_wrong_tag() {
113 let raw: Vec<u8> = vec![
114 0x41, 0x04, b'E', b'U', b'T', b'E',
116 ];
117 let err = NetworkNameDescriptor::parse(&raw).unwrap_err();
118 assert!(
119 matches!(err, Error::InvalidDescriptor { tag: 0x41, .. }),
120 "expected InvalidDescriptor(tag=0x41), got {err:?}"
121 );
122 }
123
124 #[test]
126 fn parse_rejects_buffer_shorter_than_header() {
127 let raw: &[u8] = &[0x40];
128 let err = NetworkNameDescriptor::parse(raw).unwrap_err();
129 assert!(
130 matches!(err, Error::BufferTooShort { need: 2, .. }),
131 "expected BufferTooShort(need=2), got {err:?}"
132 );
133 }
134
135 #[test]
137 fn parse_rejects_length_byte_overflowing_buffer() {
138 let raw: Vec<u8> = vec![
139 0x40, 0x05, 0xAA, 0xBB, ];
142 let err = NetworkNameDescriptor::parse(&raw).unwrap_err();
143 assert!(matches!(err, Error::BufferTooShort { .. }));
144 }
145
146 #[test]
149 fn serialize_round_trip_preserves_bytes() {
150 let raw: Vec<u8> = vec![TAG, 0x04, b'E', b'U', b'T', b'E'];
151 let parsed = NetworkNameDescriptor::parse(&raw).unwrap();
152 let mut buf = vec![0u8; parsed.serialized_len()];
153 let written = parsed.serialize_into(&mut buf).unwrap();
154 assert_eq!(written, parsed.serialized_len());
155
156 let reparsed = NetworkNameDescriptor::parse(&buf).unwrap();
157 assert_eq!(parsed, reparsed);
158 assert_eq!(&raw, &buf[..]);
159 }
160
161 #[test]
163 fn serialize_rejects_too_small_buffer() {
164 let raw: Vec<u8> = vec![TAG, 0x04, b'E', b'U', b'T', b'E'];
165 let parsed = NetworkNameDescriptor::parse(&raw).unwrap();
166 let mut tiny = vec![0u8; 1];
167 let err = parsed.serialize_into(&mut tiny).unwrap_err();
168 assert!(
169 matches!(err, Error::OutputBufferTooSmall { need, .. } if need == parsed.serialized_len()),
170 "expected OutputBufferTooSmall(need={}), got {err:?}",
171 parsed.serialized_len()
172 );
173 }
174
175 #[test]
177 fn empty_network_name_is_valid() {
178 let raw: &[u8] = &[TAG, 0x00];
179 let desc = NetworkNameDescriptor::parse(raw).unwrap();
180 assert!(desc.network_name.is_empty());
181 }
182
183 #[test]
185 fn descriptor_length_getter_matches_payload() {
186 let raw: Vec<u8> = vec![
187 TAG,
188 0x07,
189 b'F',
190 b'R',
191 b'A',
192 b'N',
193 b'C',
194 b'E',
195 b'2',
196 ];
197 let desc = NetworkNameDescriptor::parse(&raw).unwrap();
198 assert_eq!(desc.descriptor_length(), desc.network_name.len() as u8);
199 }
200}