Skip to main content

buffa_reflect/dynamic/
unknown.rs

1//! Unknown-field preservation for [`super::DynamicMessage`].
2//!
3//! Wraps `buffa::UnknownField` / `buffa::UnknownFields` so consumers of
4//! `buffa-reflect` don't need to import the upstream types when they
5//! only want round-trip fidelity.
6
7use buffa::bytes::BufMut;
8pub use buffa::unknown_fields::UnknownField;
9
10/// All unknown wire-tags observed for a single field number.
11///
12/// Wraps [`buffa::UnknownFields`]; we re-expose the upstream type
13/// behind a thin newtype so the storage layer's `ValueOrUnknown`
14/// variant has a stable name even if upstream renames things.
15#[derive(Clone, Debug, Default, PartialEq)]
16pub struct UnknownFieldSet {
17    inner: buffa::UnknownFields,
18}
19
20impl UnknownFieldSet {
21    /// Construct an empty set.
22    #[must_use]
23    pub fn new() -> Self {
24        Self::default()
25    }
26
27    /// True iff no unknown fields were recorded.
28    #[must_use]
29    pub fn is_empty(&self) -> bool {
30        self.inner.is_empty()
31    }
32
33    /// Number of recorded entries.
34    #[must_use]
35    pub fn len(&self) -> usize {
36        self.inner.len()
37    }
38
39    /// Append one entry.
40    pub fn push(&mut self, field: UnknownField) {
41        self.inner.push(field);
42    }
43
44    /// Iterate over the recorded entries in insertion order.
45    pub fn iter(&self) -> core::slice::Iter<'_, UnknownField> {
46        self.inner.iter()
47    }
48
49    /// Encoded byte length of every entry tagged at `_number`.
50    ///
51    /// (The `_number` argument is unused — entries already carry their
52    /// own number on `UnknownField::number`. Kept for symmetry with
53    /// `encode`.)
54    #[must_use]
55    pub fn encoded_len(&self, _number: u32) -> usize {
56        self.inner.encoded_len()
57    }
58
59    /// Re-emit every entry to `buf` at its original position.
60    pub fn encode(&self, _number: u32, buf: &mut impl BufMut) {
61        self.inner.write_to(buf);
62    }
63}
64
65impl<'a> IntoIterator for &'a UnknownFieldSet {
66    type Item = &'a UnknownField;
67    type IntoIter = core::slice::Iter<'a, UnknownField>;
68
69    fn into_iter(self) -> Self::IntoIter {
70        self.inner.iter()
71    }
72}