1
1
#![ deny( missing_docs) ]
2
2
#![ doc = include_str ! ( "../README.md" ) ]
3
3
4
- use merde_core:: { Deserialize , DeserializeOwned , Deserializer } ;
4
+ use merde_core:: { Deserialize , DeserializeOwned , Deserializer , Event } ;
5
5
6
6
/// A MessagePack deserializer, that implements [`merde_core::Deserializer`].
7
7
pub struct MsgpackDeserializer < ' s > {
8
8
source : & ' s [ u8 ] ,
9
9
offset : usize ,
10
10
stack : Vec < StackItem > ,
11
+ starter : Option < Event < ' s > > ,
11
12
}
12
13
13
14
#[ derive( Debug ) ]
@@ -23,6 +24,7 @@ impl<'s> MsgpackDeserializer<'s> {
23
24
source,
24
25
offset : 0 ,
25
26
stack : Vec :: new ( ) ,
27
+ starter : None ,
26
28
}
27
29
}
28
30
}
@@ -75,20 +77,24 @@ impl<'s> From<merde_core::MerdeError<'s>> for MsgpackError<'s> {
75
77
impl < ' s > merde_core:: Deserializer < ' s > for MsgpackDeserializer < ' s > {
76
78
type Error < ' es > = MsgpackError < ' es > ;
77
79
78
- fn next ( & mut self ) -> Result < merde_core:: Event < ' s > , Self :: Error < ' s > > {
80
+ fn next ( & mut self ) -> Result < Event < ' s > , Self :: Error < ' s > > {
81
+ if let Some ( ev) = self . starter . take ( ) {
82
+ return Ok ( ev) ;
83
+ }
84
+
79
85
if let Some ( stack_item) = self . stack . last_mut ( ) {
80
86
match stack_item {
81
87
StackItem :: Array ( count) => {
82
88
if * count == 0 {
83
89
self . stack . pop ( ) ;
84
- return Ok ( merde_core :: Event :: ArrayEnd ) ;
90
+ return Ok ( Event :: ArrayEnd ) ;
85
91
}
86
92
* count -= 1 ;
87
93
}
88
94
StackItem :: Map ( count) => {
89
95
if * count == 0 {
90
96
self . stack . pop ( ) ;
91
- return Ok ( merde_core :: Event :: MapEnd ) ;
97
+ return Ok ( Event :: MapEnd ) ;
92
98
}
93
99
* count -= 1 ;
94
100
}
@@ -103,22 +109,22 @@ impl<'s> merde_core::Deserializer<'s> for MsgpackDeserializer<'s> {
103
109
self . offset += 1 ;
104
110
105
111
match byte {
106
- 0xc0 => Ok ( merde_core :: Event :: Null ) ,
107
- 0xc2 => Ok ( merde_core :: Event :: Bool ( false ) ) ,
108
- 0xc3 => Ok ( merde_core :: Event :: Bool ( true ) ) ,
112
+ 0xc0 => Ok ( Event :: Null ) ,
113
+ 0xc2 => Ok ( Event :: Bool ( false ) ) ,
114
+ 0xc3 => Ok ( Event :: Bool ( true ) ) ,
109
115
0xc4 => self . read_bytes_8 ( ) ,
110
116
0xc5 => self . read_bytes_16 ( ) ,
111
117
0xc6 => self . read_bytes_32 ( ) ,
112
- 0xcc => self . read_u8 ( ) . map ( |v| merde_core :: Event :: U64 ( v as u64 ) ) ,
113
- 0xcd => self . read_u16 ( ) . map ( |v| merde_core :: Event :: U64 ( v as u64 ) ) ,
114
- 0xce => self . read_u32 ( ) . map ( |v| merde_core :: Event :: U64 ( v as u64 ) ) ,
115
- 0xcf => self . read_u64 ( ) . map ( merde_core :: Event :: U64 ) ,
116
- 0xd0 => self . read_i8 ( ) . map ( |v| merde_core :: Event :: I64 ( v as i64 ) ) ,
117
- 0xd1 => self . read_i16 ( ) . map ( |v| merde_core :: Event :: I64 ( v as i64 ) ) ,
118
- 0xd2 => self . read_i32 ( ) . map ( |v| merde_core :: Event :: I64 ( v as i64 ) ) ,
119
- 0xd3 => self . read_i64 ( ) . map ( merde_core :: Event :: I64 ) ,
120
- 0xca => self . read_f32 ( ) . map ( |v| merde_core :: Event :: Float ( v as f64 ) ) ,
121
- 0xcb => self . read_f64 ( ) . map ( merde_core :: Event :: Float ) ,
118
+ 0xcc => self . read_u8 ( ) . map ( |v| Event :: U64 ( v as u64 ) ) ,
119
+ 0xcd => self . read_u16 ( ) . map ( |v| Event :: U64 ( v as u64 ) ) ,
120
+ 0xce => self . read_u32 ( ) . map ( |v| Event :: U64 ( v as u64 ) ) ,
121
+ 0xcf => self . read_u64 ( ) . map ( Event :: U64 ) ,
122
+ 0xd0 => self . read_i8 ( ) . map ( |v| Event :: I64 ( v as i64 ) ) ,
123
+ 0xd1 => self . read_i16 ( ) . map ( |v| Event :: I64 ( v as i64 ) ) ,
124
+ 0xd2 => self . read_i32 ( ) . map ( |v| Event :: I64 ( v as i64 ) ) ,
125
+ 0xd3 => self . read_i64 ( ) . map ( Event :: I64 ) ,
126
+ 0xca => self . read_f32 ( ) . map ( |v| Event :: Float ( v as f64 ) ) ,
127
+ 0xcb => self . read_f64 ( ) . map ( Event :: Float ) ,
122
128
0xa0 ..=0xbf => {
123
129
let len = ( byte & 0x1f ) as usize ;
124
130
self . read_str ( len)
@@ -129,7 +135,7 @@ impl<'s> merde_core::Deserializer<'s> for MsgpackDeserializer<'s> {
129
135
0x90 ..=0x9f => {
130
136
let len = ( byte & 0x0f ) as usize ;
131
137
self . stack . push ( StackItem :: Array ( len) ) ;
132
- Ok ( merde_core :: Event :: ArrayStart ( merde_core:: ArrayStart {
138
+ Ok ( Event :: ArrayStart ( merde_core:: ArrayStart {
133
139
size_hint : Some ( len) ,
134
140
} ) )
135
141
}
@@ -138,29 +144,41 @@ impl<'s> merde_core::Deserializer<'s> for MsgpackDeserializer<'s> {
138
144
0x80 ..=0x8f => {
139
145
let len = ( byte & 0x0f ) as usize ;
140
146
self . stack . push ( StackItem :: Map ( len * 2 ) ) ;
141
- Ok ( merde_core :: Event :: MapStart )
147
+ Ok ( Event :: MapStart )
142
148
}
143
149
0xde => {
144
150
let len = self . read_u16 ( ) ?;
145
151
self . stack . push ( StackItem :: Map ( len as usize * 2 ) ) ;
146
- Ok ( merde_core :: Event :: MapStart )
152
+ Ok ( Event :: MapStart )
147
153
}
148
154
0xdf => {
149
155
let len = self . read_u32 ( ) ?;
150
156
self . stack . push ( StackItem :: Map ( len as usize * 2 ) ) ;
151
- Ok ( merde_core :: Event :: MapStart )
157
+ Ok ( Event :: MapStart )
152
158
}
153
- 0x00 ..=0x7f => Ok ( merde_core :: Event :: U64 ( byte as u64 ) ) ,
154
- 0xe0 ..=0xff => Ok ( merde_core :: Event :: I64 ( ( byte as i8 ) as i64 ) ) ,
159
+ 0x00 ..=0x7f => Ok ( Event :: U64 ( byte as u64 ) ) ,
160
+ 0xe0 ..=0xff => Ok ( Event :: I64 ( ( byte as i8 ) as i64 ) ) ,
155
161
0xd4 ..=0xd8 | 0xc7 ..=0xc9 => Err ( MsgpackError :: UnsupportedExtType ( byte) ) ,
156
162
_ => Err ( MsgpackError :: UnsupportedType ( byte) ) ,
157
163
}
158
164
}
159
165
160
166
async fn t_starting_with < T : Deserialize < ' s > > (
161
167
& mut self ,
162
- _starter : Option < merde_core :: Event < ' s > > ,
168
+ starter : Option < Event < ' s > > ,
163
169
) -> Result < T , Self :: Error < ' s > > {
170
+ if let Some ( starter) = starter {
171
+ if self . starter . is_some ( ) {
172
+ unreachable ! ( "setting starter when it's already set? shouldn't happen" )
173
+ }
174
+ self . starter = Some ( starter) ;
175
+ }
176
+
177
+ // TODO: when too much stack space is used, stash this,
178
+ // return Poll::Pending, to continue deserializing with
179
+ // a shallower stack.
180
+
181
+ // that's the whole trick — for now, we just recurse as usual
164
182
T :: deserialize ( self ) . await
165
183
}
166
184
}
@@ -240,67 +258,67 @@ impl<'s> MsgpackDeserializer<'s> {
240
258
self . read_u64 ( ) . map ( f64:: from_bits)
241
259
}
242
260
243
- fn read_str ( & mut self , len : usize ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
261
+ fn read_str ( & mut self , len : usize ) -> Result < Event < ' s > , MsgpackError < ' s > > {
244
262
if self . offset + len > self . source . len ( ) {
245
263
return Err ( MsgpackError :: Eof ) ;
246
264
}
247
265
let s = std:: str:: from_utf8 ( & self . source [ self . offset ..self . offset + len] )
248
266
. map_err ( |_| MsgpackError :: DecodeError ( "Invalid UTF-8 string" ) ) ?;
249
267
self . offset += len;
250
- Ok ( merde_core :: Event :: Str ( s. into ( ) ) )
268
+ Ok ( Event :: Str ( s. into ( ) ) )
251
269
}
252
270
253
- fn read_str_8 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
271
+ fn read_str_8 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
254
272
let len = self . read_u8 ( ) ? as usize ;
255
273
self . read_str ( len)
256
274
}
257
275
258
- fn read_str_16 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
276
+ fn read_str_16 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
259
277
let len = self . read_u16 ( ) ? as usize ;
260
278
self . read_str ( len)
261
279
}
262
280
263
- fn read_str_32 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
281
+ fn read_str_32 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
264
282
let len = self . read_u32 ( ) ? as usize ;
265
283
self . read_str ( len)
266
284
}
267
285
268
- fn read_bytes ( & mut self , len : usize ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
286
+ fn read_bytes ( & mut self , len : usize ) -> Result < Event < ' s > , MsgpackError < ' s > > {
269
287
if self . offset + len > self . source . len ( ) {
270
288
return Err ( MsgpackError :: Eof ) ;
271
289
}
272
290
let bytes = & self . source [ self . offset ..self . offset + len] ;
273
291
self . offset += len;
274
- Ok ( merde_core :: Event :: Bytes ( bytes. into ( ) ) )
292
+ Ok ( Event :: Bytes ( bytes. into ( ) ) )
275
293
}
276
294
277
- fn read_bytes_8 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
295
+ fn read_bytes_8 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
278
296
let len = self . read_u8 ( ) ? as usize ;
279
297
self . read_bytes ( len)
280
298
}
281
299
282
- fn read_bytes_16 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
300
+ fn read_bytes_16 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
283
301
let len = self . read_u16 ( ) ? as usize ;
284
302
self . read_bytes ( len)
285
303
}
286
304
287
- fn read_bytes_32 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
305
+ fn read_bytes_32 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
288
306
let len = self . read_u32 ( ) ? as usize ;
289
307
self . read_bytes ( len)
290
308
}
291
309
292
- fn read_array_16 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
310
+ fn read_array_16 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
293
311
let len = self . read_u16 ( ) ? as usize ;
294
312
self . stack . push ( StackItem :: Array ( len) ) ;
295
- Ok ( merde_core :: Event :: ArrayStart ( merde_core:: ArrayStart {
313
+ Ok ( Event :: ArrayStart ( merde_core:: ArrayStart {
296
314
size_hint : Some ( len) ,
297
315
} ) )
298
316
}
299
317
300
- fn read_array_32 ( & mut self ) -> Result < merde_core :: Event < ' s > , MsgpackError < ' s > > {
318
+ fn read_array_32 ( & mut self ) -> Result < Event < ' s > , MsgpackError < ' s > > {
301
319
let len = self . read_u32 ( ) ? as usize ;
302
320
self . stack . push ( StackItem :: Array ( len) ) ;
303
- Ok ( merde_core :: Event :: ArrayStart ( merde_core:: ArrayStart {
321
+ Ok ( Event :: ArrayStart ( merde_core:: ArrayStart {
304
322
size_hint : Some ( len) ,
305
323
} ) )
306
324
}
0 commit comments