aldrin_core/
unknown_fields.rs1#[cfg(test)]
2mod test;
3
4use crate::{
5 tags, DeserializeError, Serialize, SerializedValue, SerializedValueSlice, Struct, ValueKind,
6};
7use std::collections::hash_map::{HashMap, IntoIter, Iter};
8use std::convert::Infallible;
9use std::iter::{self, Empty, Map};
10use std::ops::{Deref, DerefMut};
11
12pub trait AsUnknownFields {
13 type Field: Serialize<tags::Value>;
14 type FieldsIter: Iterator<Item = (u32, Self::Field)>;
15
16 fn fields(self) -> Self::FieldsIter;
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Default)]
20pub struct UnknownFields(pub HashMap<u32, SerializedValue>);
21
22impl UnknownFields {
23 pub fn new() -> Self {
24 Self::default()
25 }
26
27 pub fn has_fields_set(&self) -> bool {
28 self.0
29 .values()
30 .filter_map(|val| val.kind().ok())
31 .any(|kind| kind != ValueKind::None)
32 }
33
34 pub fn iter(&self) -> impl ExactSizeIterator<Item = (u32, &SerializedValueSlice)> {
35 self.into_iter()
36 }
37
38 pub fn deserialize_as_value(&self) -> Result<Struct, DeserializeError> {
39 self.iter()
40 .map(|(id, val)| val.deserialize_as_value().map(|val| (id, val)))
41 .collect::<Result<_, _>>()
42 .map(Struct)
43 }
44}
45
46impl Deref for UnknownFields {
47 type Target = HashMap<u32, SerializedValue>;
48
49 fn deref(&self) -> &Self::Target {
50 &self.0
51 }
52}
53
54impl DerefMut for UnknownFields {
55 fn deref_mut(&mut self) -> &mut Self::Target {
56 &mut self.0
57 }
58}
59
60impl IntoIterator for UnknownFields {
61 type Item = (u32, SerializedValue);
62 type IntoIter = IntoIter<u32, SerializedValue>;
63
64 fn into_iter(self) -> Self::IntoIter {
65 self.0.into_iter()
66 }
67}
68
69impl<'a> IntoIterator for &'a UnknownFields {
70 type Item = (u32, &'a SerializedValueSlice);
71
72 type IntoIter = Map<
73 Iter<'a, u32, SerializedValue>,
74 fn((&'a u32, &'a SerializedValue)) -> (u32, &'a SerializedValueSlice),
75 >;
76
77 fn into_iter(self) -> Self::IntoIter {
78 self.0.iter().map(|(id, val)| (*id, val))
79 }
80}
81
82impl AsUnknownFields for UnknownFields {
83 type Field = SerializedValue;
84 type FieldsIter = <Self as IntoIterator>::IntoIter;
85
86 fn fields(self) -> Self::FieldsIter {
87 self.into_iter()
88 }
89}
90
91impl<'a> AsUnknownFields for &'a UnknownFields {
92 type Field = &'a SerializedValueSlice;
93 type FieldsIter = <Self as IntoIterator>::IntoIter;
94
95 fn fields(self) -> Self::FieldsIter {
96 self.into_iter()
97 }
98}
99
100#[derive(Debug, Copy, Clone)]
101pub struct UnknownFieldsRef<Fields>(pub Fields);
102
103impl<Fields, Field> AsUnknownFields for UnknownFieldsRef<Fields>
104where
105 Fields: IntoIterator<Item = (u32, Field)>,
106 Field: Serialize<tags::Value>,
107{
108 type Field = Field;
109 type FieldsIter = Fields::IntoIter;
110
111 fn fields(self) -> Self::FieldsIter {
112 self.0.into_iter()
113 }
114}
115
116impl AsUnknownFields for () {
117 type Field = Infallible;
118 type FieldsIter = Empty<(u32, Infallible)>;
119
120 fn fields(self) -> Self::FieldsIter {
121 iter::empty()
122 }
123}
124
125impl AsUnknownFields for Infallible {
126 type Field = Self;
127 type FieldsIter = Empty<(u32, Self)>;
128
129 fn fields(self) -> Self::FieldsIter {
130 iter::empty()
131 }
132}