1use alloc::vec::Vec;
4use bytes::BufMut;
5
6#[derive(Clone, Debug, Default, PartialEq, Hash)]
12pub struct UnknownFields {
13 fields: Vec<UnknownField>,
14}
15
16impl UnknownFields {
17 pub fn new() -> Self {
19 Self::default()
20 }
21
22 pub fn is_empty(&self) -> bool {
24 self.fields.is_empty()
25 }
26
27 pub fn len(&self) -> usize {
29 self.fields.len()
30 }
31
32 pub fn push(&mut self, field: UnknownField) {
34 self.fields.push(field);
35 }
36
37 pub fn iter(&self) -> core::slice::Iter<'_, UnknownField> {
39 self.fields.iter()
40 }
41
42 pub fn clear(&mut self) {
44 self.fields.clear();
45 }
46
47 pub fn retain(&mut self, f: impl FnMut(&UnknownField) -> bool) {
53 self.fields.retain(f);
54 }
55
56 pub fn encoded_len(&self) -> usize {
58 self.fields.iter().map(|f| f.encoded_len()).sum()
59 }
60
61 pub fn write_to(&self, buf: &mut impl BufMut) {
63 for field in &self.fields {
64 field.write_to(buf);
65 }
66 }
67
68 pub fn decode_from_slice(mut data: &[u8]) -> Result<Self, crate::DecodeError> {
83 use crate::encoding::{decode_unknown_field, Tag};
84 use crate::message::RECURSION_LIMIT;
85 let mut out = Self::new();
86 while !data.is_empty() {
87 let tag = Tag::decode(&mut data)?;
88 out.push(decode_unknown_field(tag, &mut data, RECURSION_LIMIT)?);
89 }
90 Ok(out)
91 }
92}
93
94impl<'a> IntoIterator for &'a UnknownFields {
95 type Item = &'a UnknownField;
96 type IntoIter = core::slice::Iter<'a, UnknownField>;
97
98 fn into_iter(self) -> Self::IntoIter {
99 self.fields.iter()
100 }
101}
102
103impl IntoIterator for UnknownFields {
104 type Item = UnknownField;
105 type IntoIter = alloc::vec::IntoIter<UnknownField>;
106
107 fn into_iter(self) -> Self::IntoIter {
108 self.fields.into_iter()
109 }
110}
111
112#[derive(Clone, Debug, PartialEq, Hash)]
114pub struct UnknownField {
115 pub number: u32,
116 pub data: UnknownFieldData,
117}
118
119impl UnknownField {
120 pub fn encoded_len(&self) -> usize {
122 let tag_len =
123 crate::encoding::varint_len(((self.number as u64) << 3) | self.data.wire_type_value());
124 tag_len + self.data.encoded_len(self.number)
125 }
126
127 pub fn write_to(&self, buf: &mut impl BufMut) {
129 use crate::encoding::encode_varint;
130 let tag_value = ((self.number as u64) << 3) | self.data.wire_type_value();
131 encode_varint(tag_value, buf);
132 match &self.data {
133 UnknownFieldData::Varint(v) => encode_varint(*v, buf),
134 UnknownFieldData::Fixed64(v) => buf.put_u64_le(*v),
135 UnknownFieldData::Fixed32(v) => buf.put_u32_le(*v),
136 UnknownFieldData::LengthDelimited(data) => {
137 encode_varint(data.len() as u64, buf);
138 buf.put_slice(data);
139 }
140 UnknownFieldData::Group(fields) => {
141 fields.write_to(buf);
142 encode_varint(((self.number as u64) << 3) | 4, buf);
144 }
145 }
146 }
147}
148
149#[derive(Clone, Debug, PartialEq, Hash)]
151pub enum UnknownFieldData {
152 Varint(u64),
153 Fixed64(u64),
154 Fixed32(u32),
155 LengthDelimited(Vec<u8>),
156 Group(UnknownFields),
157}
158
159impl UnknownFieldData {
160 fn wire_type_value(&self) -> u64 {
161 match self {
162 Self::Varint(_) => 0,
163 Self::Fixed64(_) => 1,
164 Self::LengthDelimited(_) => 2,
165 Self::Group(_) => 3,
166 Self::Fixed32(_) => 5,
167 }
168 }
169
170 fn encoded_len(&self, field_number: u32) -> usize {
171 match self {
172 Self::Varint(v) => crate::encoding::varint_len(*v),
173 Self::Fixed64(_) => 8,
174 Self::Fixed32(_) => 4,
175 Self::LengthDelimited(data) => {
176 crate::encoding::varint_len(data.len() as u64) + data.len()
177 }
178 Self::Group(fields) => {
179 let end_tag_len = crate::encoding::varint_len((field_number as u64) << 3 | 4);
181 fields.encoded_len() + end_tag_len
182 }
183 }
184 }
185}
186
187#[cfg(feature = "arbitrary")]
188impl<'a> arbitrary::Arbitrary<'a> for UnknownFields {
189 fn arbitrary(_u: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {
190 Ok(UnknownFields::new())
191 }
192}
193
194#[cfg(test)]
195mod tests {
196 use super::*;
197 use crate::encoding::MAX_FIELD_NUMBER;
198
199 fn varint_field(number: u32, value: u64) -> UnknownField {
200 UnknownField {
201 number,
202 data: UnknownFieldData::Varint(value),
203 }
204 }
205
206 fn fixed32_field(number: u32, value: u32) -> UnknownField {
207 UnknownField {
208 number,
209 data: UnknownFieldData::Fixed32(value),
210 }
211 }
212
213 fn fixed64_field(number: u32, value: u64) -> UnknownField {
214 UnknownField {
215 number,
216 data: UnknownFieldData::Fixed64(value),
217 }
218 }
219
220 fn ld_field(number: u32, data: Vec<u8>) -> UnknownField {
221 UnknownField {
222 number,
223 data: UnknownFieldData::LengthDelimited(data),
224 }
225 }
226
227 fn group_field(number: u32, fields: UnknownFields) -> UnknownField {
228 UnknownField {
229 number,
230 data: UnknownFieldData::Group(fields),
231 }
232 }
233
234 #[test]
235 fn test_empty_encoded_len() {
236 assert_eq!(UnknownFields::new().encoded_len(), 0);
237 }
238
239 #[test]
240 fn test_varint_encoded_len() {
241 assert_eq!(varint_field(1, 0).encoded_len(), 2);
243 assert_eq!(varint_field(1, 128).encoded_len(), 3);
245 }
246
247 #[test]
248 fn test_fixed32_encoded_len() {
249 assert_eq!(fixed32_field(1, 0xDEAD_BEEF).encoded_len(), 5);
251 }
252
253 #[test]
254 fn test_fixed64_encoded_len() {
255 assert_eq!(fixed64_field(1, 0xDEAD_BEEF_CAFE_BABE).encoded_len(), 9);
257 }
258
259 #[test]
260 fn test_length_delimited_encoded_len() {
261 assert_eq!(ld_field(1, vec![0xAA, 0xBB, 0xCC]).encoded_len(), 5);
263 assert_eq!(ld_field(1, vec![]).encoded_len(), 2);
265 assert_eq!(ld_field(1, vec![0u8; 128]).encoded_len(), 131);
267 }
268
269 #[test]
270 fn test_group_encoded_len() {
271 assert_eq!(group_field(1, UnknownFields::new()).encoded_len(), 2);
273 let mut inner = UnknownFields::new();
276 inner.push(varint_field(1, 0));
277 assert_eq!(group_field(1, inner).encoded_len(), 4);
278 }
279
280 #[test]
281 fn test_large_field_number_two_byte_tag() {
282 assert_eq!(varint_field(16, 0).encoded_len(), 3);
284 }
285
286 #[test]
287 fn test_multiple_fields_sum() {
288 let mut fields = UnknownFields::new();
289 fields.push(varint_field(1, 0)); fields.push(fixed32_field(2, 0)); assert_eq!(fields.encoded_len(), 7);
292 }
293
294 #[test]
295 fn test_into_iter_by_ref() {
296 let mut fields = UnknownFields::new();
297 fields.push(varint_field(1, 0));
298 fields.push(varint_field(2, 0));
299 let numbers: Vec<u32> = (&fields).into_iter().map(|f| f.number).collect();
300 assert_eq!(numbers, vec![1, 2]);
301 let mut count = 0;
303 for _ in &fields {
304 count += 1;
305 }
306 assert_eq!(count, 2);
307 }
308
309 fn assert_len_matches_write(f: UnknownField) {
317 let mut fields = UnknownFields::new();
318 let claimed = f.encoded_len();
319 fields.push(f);
320 let mut buf = alloc::vec::Vec::new();
321 fields.write_to(&mut buf);
322 assert_eq!(
323 buf.len(),
324 claimed,
325 "encoded_len={claimed} but wrote {} bytes for {fields:?}",
326 buf.len()
327 );
328 }
329
330 #[test]
331 fn test_encoded_len_matches_write_varint() {
332 for &num in &[1, 15, 16, 2047, 2048, MAX_FIELD_NUMBER] {
333 for &val in &[0, 1, 127, 128, u32::MAX as u64, u64::MAX] {
334 assert_len_matches_write(varint_field(num, val));
335 }
336 }
337 }
338
339 #[test]
340 fn test_encoded_len_matches_write_fixed() {
341 for &num in &[1, 16, MAX_FIELD_NUMBER] {
342 assert_len_matches_write(fixed32_field(num, 0));
343 assert_len_matches_write(fixed32_field(num, u32::MAX));
344 assert_len_matches_write(fixed64_field(num, 0));
345 assert_len_matches_write(fixed64_field(num, u64::MAX));
346 }
347 }
348
349 #[test]
350 fn test_encoded_len_matches_write_length_delimited() {
351 for &num in &[1, 16, MAX_FIELD_NUMBER] {
352 assert_len_matches_write(ld_field(num, alloc::vec![]));
353 assert_len_matches_write(ld_field(num, alloc::vec![0xAB]));
354 assert_len_matches_write(ld_field(num, alloc::vec![0; 127]));
355 assert_len_matches_write(ld_field(num, alloc::vec![0; 128]));
356 }
357 }
358
359 #[test]
360 fn test_encoded_len_matches_write_group() {
361 for &num in &[1, 16, MAX_FIELD_NUMBER] {
362 assert_len_matches_write(group_field(num, UnknownFields::new()));
364 let mut inner = UnknownFields::new();
366 inner.push(varint_field(2, 42));
367 inner.push(ld_field(3, alloc::vec![1, 2, 3]));
368 assert_len_matches_write(group_field(num, inner.clone()));
369 let mut inner2 = UnknownFields::new();
371 inner2.push(group_field(4, inner));
372 assert_len_matches_write(group_field(num, inner2));
373 }
374 }
375
376 #[test]
377 fn test_encoded_len_matches_write_multi_field() {
378 let mut fields = UnknownFields::new();
380 fields.push(varint_field(1, 42));
381 fields.push(fixed32_field(2, 0xDEADBEEF));
382 fields.push(fixed64_field(3, u64::MAX));
383 fields.push(ld_field(4, alloc::vec![1, 2, 3, 4, 5]));
384 let mut nested = UnknownFields::new();
385 nested.push(varint_field(10, 7));
386 fields.push(group_field(5, nested));
387 let claimed = fields.encoded_len();
388 let mut buf = alloc::vec::Vec::new();
389 fields.write_to(&mut buf);
390 assert_eq!(buf.len(), claimed);
391 }
392
393 #[test]
396 fn test_decode_from_slice_empty() {
397 let out = UnknownFields::decode_from_slice(&[]).unwrap();
398 assert!(out.is_empty());
399 }
400
401 #[test]
402 fn test_decode_from_slice_roundtrip() {
403 let mut orig = UnknownFields::new();
405 orig.push(varint_field(1, 42));
406 orig.push(fixed32_field(2, 0xDEAD_BEEF));
407 orig.push(fixed64_field(3, u64::MAX));
408 orig.push(ld_field(4, vec![1, 2, 3]));
409 let mut nested = UnknownFields::new();
410 nested.push(varint_field(10, 7));
411 orig.push(group_field(5, nested));
412
413 let mut buf = Vec::new();
414 orig.write_to(&mut buf);
415 let decoded = UnknownFields::decode_from_slice(&buf).unwrap();
416 assert_eq!(decoded, orig);
417 }
418
419 #[test]
420 fn test_decode_from_slice_truncated() {
421 assert!(UnknownFields::decode_from_slice(&[0x08]).is_err());
423 }
424}