1use std::ops::Deref;
10
11use bincode::Options;
12use bytes::Bytes;
13use bytes::BytesMut;
14use bytes::buf::Reader as BufReader;
15use bytes::buf::Writer as BufWriter;
16use serde::Deserialize;
17use serde::Serialize;
18use serde::de::DeserializeOwned;
19use typeuri::Named;
20
21use crate::UnsafeBufCellRef;
22use crate::de;
23use crate::ser;
24
25#[derive(Clone, Debug, PartialEq, Eq, Default)]
31pub struct Part {
32 typehash: Option<u64>,
33 fragments: Vec<Bytes>,
34}
35
36impl Part {
37 pub fn into_fragments(self) -> Vec<Bytes> {
39 self.fragments
40 }
41
42 pub fn into_bytes(self) -> Bytes {
44 match self.fragments.len() {
45 0 => Bytes::new(),
46 1 => self.fragments.into_iter().next().unwrap(),
47 _ => {
48 let total_len: usize = self.fragments.iter().map(|p| p.len()).sum();
49 let mut result = BytesMut::with_capacity(total_len);
50 for fragment in self.fragments {
51 result.extend_from_slice(&fragment);
52 }
53 result.freeze()
54 }
55 }
56 }
57
58 pub fn to_bytes(&self) -> Bytes {
60 match self.fragments.len() {
61 0 => Bytes::new(),
62 1 => self.fragments.first().unwrap().clone(),
63 _ => {
64 let total_len: usize = self.fragments.iter().map(|p| p.len()).sum();
65 let mut result = BytesMut::with_capacity(total_len);
66 for fragment in &self.fragments {
67 result.extend_from_slice(fragment);
68 }
69 result.freeze()
70 }
71 }
72 }
73
74 pub fn len(&self) -> usize {
76 self.fragments
77 .iter()
78 .try_fold(0usize, |len, fragment| len.checked_add(fragment.len()))
79 .expect("part length exceeds usize")
80 }
81
82 pub fn num_fragments(&self) -> usize {
84 self.fragments.len()
85 }
86
87 pub fn is_empty(&self) -> bool {
89 self.fragments.iter().all(|b| b.is_empty())
90 }
91
92 pub fn typehash(&self) -> Option<u64> {
94 self.typehash
95 }
96
97 pub fn is<T: Named>(&self) -> bool {
99 self.typehash == Some(T::typehash())
100 }
101
102 pub fn serialize<T: Serialize + Named>(value: &T) -> crate::Result<Self> {
104 Self::serialize_as::<T, T>(value)
105 }
106
107 pub fn serialize_as<T, U>(value: &U) -> crate::Result<Self>
109 where
110 T: Named,
111 U: Serialize,
112 {
113 Ok(Self {
114 typehash: Some(T::typehash()),
115 fragments: vec![Bytes::from(crate::options().serialize(value)?)],
116 })
117 }
118
119 pub fn deserialized<T: DeserializeOwned + Named>(&self) -> crate::Result<T> {
121 self.deserialized_as::<T, T>()
122 }
123
124 pub fn deserialized_as<T, U>(&self) -> crate::Result<U>
126 where
127 T: Named,
128 U: DeserializeOwned,
129 {
130 if !self.is::<T>() {
131 return Err(crate::Error::TypeMismatch {
132 expected: T::typename(),
133 actual: self
134 .typehash
135 .map_or_else(|| "unknown".to_string(), |typehash| typehash.to_string()),
136 });
137 }
138 self.deserialized_unchecked()
139 }
140
141 pub fn deserialized_unchecked<T: DeserializeOwned>(&self) -> crate::Result<T> {
143 Ok(crate::options().deserialize(&self.to_bytes())?)
144 }
145
146 pub fn from_fragments(fragments: Vec<Bytes>) -> Self {
148 Self {
149 typehash: None,
150 fragments,
151 }
152 }
153
154 pub(crate) fn from_typehash_and_fragments(
156 typehash: Option<u64>,
157 fragments: Vec<Bytes>,
158 ) -> Self {
159 Self {
160 typehash,
161 fragments,
162 }
163 }
164}
165
166impl<T: Into<Bytes>> From<T> for Part {
167 fn from(bytes: T) -> Self {
168 Self {
169 typehash: None,
170 fragments: vec![bytes.into()],
171 }
172 }
173}
174
175impl Deref for Part {
176 type Target = Vec<Bytes>;
177
178 fn deref(&self) -> &Self::Target {
179 &self.fragments
180 }
181}
182
183impl Serialize for Part {
184 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
185 <Part as PartSerializer<S>>::serialize(self, s)
186 }
187}
188
189impl<'de> Deserialize<'de> for Part {
190 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
191 <Part as PartDeserializer<'de, D>>::deserialize(d)
192 }
193}
194
195pub trait PartSerializer<S: serde::Serializer> {
198 fn serialize(this: &Part, s: S) -> Result<S::Ok, S::Error>;
199}
200
201impl<S: serde::Serializer> PartSerializer<S> for Part {
204 default fn serialize(this: &Part, s: S) -> Result<S::Ok, S::Error> {
205 (&this.typehash, &this.fragments).serialize(s)
206 }
207}
208
209pub(crate) type BincodeOptionsType = bincode::config::WithOtherTrailing<
212 bincode::config::WithOtherIntEncoding<bincode::DefaultOptions, bincode::config::FixintEncoding>,
213 bincode::config::AllowTrailing,
214>;
215
216pub(crate) type BincodeSerializer =
219 ser::bincode::Serializer<BufWriter<UnsafeBufCellRef>, BincodeOptionsType>;
220
221impl<'a> PartSerializer<&'a mut BincodeSerializer> for Part {
223 fn serialize(this: &Part, s: &'a mut BincodeSerializer) -> Result<(), bincode::Error> {
224 s.serialize_part(this);
225 Ok(())
226 }
227}
228
229trait PartDeserializer<'de, S: serde::Deserializer<'de>>: Sized {
232 fn deserialize(this: S) -> Result<Self, S::Error>;
233}
234
235impl<'de, D: serde::Deserializer<'de>> PartDeserializer<'de, D> for Part {
238 default fn deserialize(deserializer: D) -> Result<Self, D::Error> {
239 let (typehash, fragments) = <(Option<u64>, Vec<Bytes>)>::deserialize(deserializer)?;
240 Ok(Self {
241 typehash,
242 fragments,
243 })
244 }
245}
246
247pub(crate) type BincodeDeserializer =
250 de::bincode::Deserializer<bincode::de::read::IoReader<BufReader<Bytes>>, BincodeOptionsType>;
251
252impl<'a> PartDeserializer<'_, &'a mut BincodeDeserializer> for Part {
254 fn deserialize(deserializer: &'a mut BincodeDeserializer) -> Result<Self, bincode::Error> {
255 deserializer.deserialize_part()
256 }
257}