Skip to content

Commit fd07d9b

Browse files
committed
chore(data): more ser impls
1 parent ff74654 commit fd07d9b

File tree

2 files changed

+157
-30
lines changed

2 files changed

+157
-30
lines changed

crates/data/src/lib.rs

+62-13
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,74 @@
11
use uuid::Uuid;
22

3-
#[cfg(feature = "serde")]
4-
pub mod serde;
53
mod ser;
64
mod error;
75

86
pub struct DataType<T> {
97
id: Uuid
108
}
119

10+
#[derive(PartialEq)]
1211
pub enum Marker {
13-
Unit = 0,
14-
SeqBegin = 1,
15-
SeqEnd = 2,
12+
Unit,
13+
SeqBegin,
14+
SeqBreak,
15+
SeqEnd,
16+
OptBegin,
17+
OptEnd,
18+
StructBegin,
19+
StructBreak,
20+
StructEnd,
21+
TupleBegin,
22+
TupleBreak,
23+
TupleEnd,
24+
TupleStructBegin,
25+
TupleStructBreak,
26+
TupleStructEnd,
1627
}
1728

18-
// impl From<Marker> for u8 {
19-
// fn from(marker: Marker) -> Self {
20-
// match marker {
21-
// Marker::OptionBegin => 1,
22-
// Marker::OptionEnd => 2,
23-
// }
24-
// }
25-
// }
29+
impl From<Marker> for u8 {
30+
fn from(value: Marker) -> Self {
31+
match value {
32+
Marker::Unit => 0,
33+
Marker::SeqBegin => 1,
34+
Marker::SeqBreak => 2,
35+
Marker::SeqEnd => 3,
36+
Marker::OptBegin => 4,
37+
Marker::OptEnd => 5,
38+
Marker::StructBegin => 6,
39+
Marker::StructBreak => 7,
40+
Marker::StructEnd => 8,
41+
Marker::TupleBegin => 9,
42+
Marker::TupleBreak => 10,
43+
Marker::TupleEnd => 11,
44+
Marker::TupleStructBegin => 12,
45+
Marker::TupleStructBreak => 13,
46+
Marker::TupleStructEnd => 14,
47+
}
48+
}
49+
}
50+
51+
impl TryFrom<u8> for Marker {
52+
type Error = error::Error;
53+
54+
fn try_from(value: u8) -> error::Result<Self> {
55+
match value {
56+
0 => Ok(Marker::Unit),
57+
1 => Ok(Marker::SeqBegin),
58+
2 => Ok(Marker::SeqBreak),
59+
3 => Ok(Marker::SeqEnd),
60+
4 => Ok(Marker::OptBegin),
61+
5 => Ok(Marker::OptEnd),
62+
6 => Ok(Marker::StructBegin),
63+
7 => Ok(Marker::StructBreak),
64+
8 => Ok(Marker::StructEnd),
65+
9 => Ok(Marker::TupleBegin),
66+
10 => Ok(Marker::TupleBreak),
67+
11 => Ok(Marker::TupleEnd),
68+
12 => Ok(Marker::TupleStructBegin),
69+
13 => Ok(Marker::TupleStructBreak),
70+
14 => Ok(Marker::TupleStructEnd),
71+
_ => Err(error::Error::Message("Unknown ".to_string()))
72+
}
73+
}
74+
}

crates/data/src/ser.rs

+95-17
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ where
3333
impl<'a, TData> ser::Serializer for &'a mut DataSerializer<TData> where TData : Serialize {
3434
type Ok = ();
3535
type Error = Error;
36-
type SerializeSeq = ();
37-
type SerializeTuple = ();
38-
type SerializeTupleStruct = ();
36+
type SerializeSeq = Self;
37+
type SerializeTuple = Self;
38+
type SerializeTupleStruct = Self;
3939
type SerializeTupleVariant = ();
4040
type SerializeMap = ();
4141
type SerializeStruct = ();
@@ -141,14 +141,20 @@ impl<'a, TData> ser::Serializer for &'a mut DataSerializer<TData> where TData :
141141
}
142142

143143
fn serialize_none(self) -> Result<()> {
144-
self.serialize_unit()
144+
self.marker(Marker::OptBegin)?;
145+
self.serialize_bool(false)?; // not present
146+
self.serialize_unit()?;
147+
self.marker(Marker::OptEnd)
145148
}
146149

147150
fn serialize_some<T>(self, value: &T) -> Result<()>
148151
where
149152
T: ?Sized + Serialize
150153
{
151-
todo!()
154+
self.marker(Marker::OptBegin)?;
155+
self.serialize_bool(true)?; // present
156+
value.serialize(self)?;
157+
self.marker(Marker::OptEnd)
152158
}
153159

154160
fn serialize_unit(self) -> Result<()> {
@@ -177,37 +183,109 @@ impl<'a, TData> ser::Serializer for &'a mut DataSerializer<TData> where TData :
177183
todo!()
178184
}
179185

180-
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
181-
todo!()
186+
fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
187+
if let Some(length) = len {
188+
self.serialize_u64(length as u64)?;
189+
}
190+
191+
self.marker(Marker::SeqBegin)?;
192+
Ok(self)
182193
}
183194

184-
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
185-
todo!()
195+
fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
196+
self.marker(Marker::TupleBegin)?;
197+
self.serialize_seq(Some(len))
186198
}
187199

188-
fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct, Self::Error> {
189-
todo!()
200+
fn serialize_tuple_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct> {
201+
self.serialize_seq(Some(len))
190202
}
191203

192-
fn serialize_tuple_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant, Self::Error> {
204+
fn serialize_tuple_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeTupleVariant> {
193205
todo!()
194206
}
195207

196-
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
208+
fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
197209
todo!()
198210
}
199211

200-
fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct, Self::Error> {
212+
fn serialize_struct(self, name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
201213
todo!()
202214
}
203215

204-
fn serialize_struct_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant, Self::Error> {
216+
fn serialize_struct_variant(self, name: &'static str, variant_index: u32, variant: &'static str, len: usize) -> Result<Self::SerializeStructVariant> {
205217
todo!()
206218
}
207219
}
208220

209-
impl<'a, TData> ser::SerializeSeq for &'a mut DataSerializer<TData>
221+
impl<'a, TData> ser::SerializeSeq for &'a mut DataSerializer<TData> {
222+
type Ok = ();
223+
type Error = Error;
224+
225+
fn serialize_element<T>(&mut self, value: &T) -> Result<()>
226+
where
227+
T: ?Sized + Serialize
228+
{
229+
let last_marker = Marker::try_from(&self.output[(self.output.len()-1)..][0])?;
230+
231+
if last_marker != Marker::SeqBegin {
232+
self.marker(Marker::SeqBreak)?;
233+
}
234+
235+
value.serialize(&mut **self)
236+
}
237+
238+
fn end(self) -> Result<()> {
239+
self.marker(Marker::SeqEnd)
240+
}
241+
}
242+
243+
impl<'a, TData : Serialize> ser::SerializeTuple for &'a mut DataSerializer<TData> {
244+
type Ok = ();
245+
type Error = Error;
246+
247+
fn serialize_element<TElement>(&mut self, value: &TElement) -> Result<()>
248+
where
249+
TElement: ?Sized + Serialize,
250+
{
251+
let last_marker = Marker::try_from(&self.output[(self.output.len()-1)..][0])?;
252+
253+
if last_marker != Marker::TupleBegin {
254+
self.marker(Marker::TupleBreak)?;
255+
}
256+
value.serialize(&mut **self)
257+
}
258+
259+
fn end(self) -> Result<()> {
260+
self.marker(Marker::TupleEnd)?;
261+
Ok(())
262+
}
263+
}
264+
265+
impl<'a, TData : Serialize> ser::SerializeTupleStruct for &'a mut DataSerializer<TData> {
266+
type Ok = ();
267+
type Error = Error;
268+
269+
fn serialize_field<T>(&mut self, value: &T) -> Result<()>
270+
where
271+
T: ?Sized + Serialize,
272+
{
273+
let last_marker = Marker::try_from(&self.output[(self.output.len()-1)..][0])?;
274+
275+
if last_marker != Marker::TupleStructBegin {
276+
self.marker(Marker::TupleStructBreak)?;
277+
}
278+
value.serialize(&mut **self)
279+
}
280+
281+
fn end(self) -> Result<()> {
282+
self.marker(Marker::TupleStructEnd)?;
283+
Ok(())
284+
}
285+
}
286+
287+
210288

211289
trait SerializeData<TData> where TData: SerializeData<TData> {
212-
fn serialize(serializer: DataSerializer<TData, dyn SerializeData<TData>>) -> io::Result<usize>;
290+
fn serialize(serializer: DataSerializer<TData>) -> io::Result<usize>;
213291
}

0 commit comments

Comments
 (0)