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, 0x04, b'E', b'U', b'T', b'E',
101 ];
102 let desc = NetworkNameDescriptor::parse(&raw).unwrap();
103 assert_eq!(desc.network_name, b"EUTE");
104 }
105
106 #[test]
108 fn parse_rejects_wrong_tag() {
109 let raw: Vec<u8> = vec![
110 0x41, 0x04, b'E', b'U', b'T', b'E',
112 ];
113 let err = NetworkNameDescriptor::parse(&raw).unwrap_err();
114 assert!(
115 matches!(err, Error::InvalidDescriptor { tag: 0x41, .. }),
116 "expected InvalidDescriptor(tag=0x41), got {err:?}"
117 );
118 }
119
120 #[test]
122 fn parse_rejects_buffer_shorter_than_header() {
123 let raw: &[u8] = &[0x40];
124 let err = NetworkNameDescriptor::parse(raw).unwrap_err();
125 assert!(
126 matches!(err, Error::BufferTooShort { need: 2, .. }),
127 "expected BufferTooShort(need=2), got {err:?}"
128 );
129 }
130
131 #[test]
133 fn parse_rejects_length_byte_overflowing_buffer() {
134 let raw: Vec<u8> = vec![
135 0x40, 0x05, 0xAA, 0xBB, ];
138 let err = NetworkNameDescriptor::parse(&raw).unwrap_err();
139 assert!(matches!(err, Error::BufferTooShort { .. }));
140 }
141
142 #[test]
145 fn serialize_round_trip_preserves_bytes() {
146 let raw: Vec<u8> = vec![TAG, 0x04, b'E', b'U', b'T', b'E'];
147 let parsed = NetworkNameDescriptor::parse(&raw).unwrap();
148 let mut buf = vec![0u8; parsed.serialized_len()];
149 let written = parsed.serialize_into(&mut buf).unwrap();
150 assert_eq!(written, parsed.serialized_len());
151
152 let reparsed = NetworkNameDescriptor::parse(&buf).unwrap();
153 assert_eq!(parsed, reparsed);
154 assert_eq!(&raw, &buf[..]);
155 }
156
157 #[test]
159 fn serialize_rejects_too_small_buffer() {
160 let raw: Vec<u8> = vec![TAG, 0x04, b'E', b'U', b'T', b'E'];
161 let parsed = NetworkNameDescriptor::parse(&raw).unwrap();
162 let mut tiny = vec![0u8; 1];
163 let err = parsed.serialize_into(&mut tiny).unwrap_err();
164 assert!(
165 matches!(err, Error::OutputBufferTooSmall { need, .. } if need == parsed.serialized_len()),
166 "expected OutputBufferTooSmall(need={}), got {err:?}",
167 parsed.serialized_len()
168 );
169 }
170
171 #[test]
173 fn empty_network_name_is_valid() {
174 let raw: &[u8] = &[TAG, 0x00];
175 let desc = NetworkNameDescriptor::parse(raw).unwrap();
176 assert!(desc.network_name.is_empty());
177 }
178
179 #[test]
181 fn descriptor_length_getter_matches_payload() {
182 let raw: Vec<u8> = vec![TAG, 0x07, b'F', b'R', b'A', b'N', b'C', b'E', b'2'];
183 let desc = NetworkNameDescriptor::parse(&raw).unwrap();
184 assert_eq!(desc.descriptor_length(), desc.network_name.len() as u8);
185 }
186}