1use std::ops::Deref;
10
11use bytes::Bytes;
12use bytes::BytesMut;
13use bytes::buf::Reader as BufReader;
14use bytes::buf::Writer as BufWriter;
15use serde::Deserialize;
16use serde::Serialize;
17
18use crate::UnsafeBufCellRef;
19use crate::de;
20use crate::ser;
21
22#[derive(Clone, Debug, PartialEq, Eq, Default)]
28pub struct Part(pub(crate) Vec<Bytes>);
29
30impl Part {
31 pub fn into_inner(self) -> Vec<Bytes> {
33 self.0
34 }
35
36 pub fn into_bytes(self) -> Bytes {
38 match self.0.len() {
39 0 => Bytes::new(),
40 1 => self.0.into_iter().next().unwrap(),
41 _ => {
42 let total_len: usize = self.0.iter().map(|p| p.len()).sum();
43 let mut result = BytesMut::with_capacity(total_len);
44 for fragment in self.0 {
45 result.extend_from_slice(&fragment);
46 }
47 result.freeze()
48 }
49 }
50 }
51
52 pub fn to_bytes(&self) -> Bytes {
54 match self.0.len() {
55 0 => Bytes::new(),
56 1 => self.0.first().unwrap().clone(),
57 _ => {
58 let total_len: usize = self.0.iter().map(|p| p.len()).sum();
59 let mut result = BytesMut::with_capacity(total_len);
60 for fragment in &self.0 {
61 result.extend_from_slice(fragment);
62 }
63 result.freeze()
64 }
65 }
66 }
67
68 pub fn len(&self) -> usize {
70 self.0.iter().map(|b| b.len()).sum()
71 }
72
73 pub fn num_fragments(&self) -> usize {
75 self.0.len()
76 }
77
78 pub fn is_empty(&self) -> bool {
80 self.0.iter().all(|b| b.is_empty())
81 }
82
83 pub fn from_fragments(fragments: Vec<Bytes>) -> Self {
84 Self(fragments)
85 }
86}
87
88impl<T: Into<Bytes>> From<T> for Part {
89 fn from(bytes: T) -> Self {
90 Self(vec![bytes.into()])
91 }
92}
93
94impl Deref for Part {
95 type Target = Vec<Bytes>;
96
97 fn deref(&self) -> &Self::Target {
98 &self.0
99 }
100}
101
102impl Serialize for Part {
103 fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
104 <Part as PartSerializer<S>>::serialize(self, s)
105 }
106}
107
108impl<'de> Deserialize<'de> for Part {
109 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
110 <Part as PartDeserializer<'de, D>>::deserialize(d)
111 }
112}
113
114pub trait PartSerializer<S: serde::Serializer> {
117 fn serialize(this: &Part, s: S) -> Result<S::Ok, S::Error>;
118}
119
120impl<S: serde::Serializer> PartSerializer<S> for Part {
123 default fn serialize(this: &Part, s: S) -> Result<S::Ok, S::Error> {
124 this.to_bytes().serialize(s)
126 }
127}
128
129pub(crate) type BincodeOptionsType = bincode::config::WithOtherTrailing<
132 bincode::config::WithOtherIntEncoding<bincode::DefaultOptions, bincode::config::FixintEncoding>,
133 bincode::config::AllowTrailing,
134>;
135
136pub(crate) type BincodeSerializer =
139 ser::bincode::Serializer<BufWriter<UnsafeBufCellRef>, BincodeOptionsType>;
140
141impl<'a> PartSerializer<&'a mut BincodeSerializer> for Part {
143 fn serialize(this: &Part, s: &'a mut BincodeSerializer) -> Result<(), bincode::Error> {
144 s.serialize_part(this);
145 Ok(())
146 }
147}
148
149trait PartDeserializer<'de, S: serde::Deserializer<'de>>: Sized {
152 fn deserialize(this: S) -> Result<Self, S::Error>;
153}
154
155impl<'de, D: serde::Deserializer<'de>> PartDeserializer<'de, D> for Part {
158 default fn deserialize(deserializer: D) -> Result<Self, D::Error> {
159 Ok(Part(vec![Bytes::deserialize(deserializer)?]))
160 }
161}
162
163pub(crate) type BincodeDeserializer =
166 de::bincode::Deserializer<bincode::de::read::IoReader<BufReader<Bytes>>, BincodeOptionsType>;
167
168impl<'de, 'a> PartDeserializer<'de, &'a mut BincodeDeserializer> for Part {
170 fn deserialize(deserializer: &'a mut BincodeDeserializer) -> Result<Self, bincode::Error> {
171 deserializer.deserialize_part()
172 }
173}