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}