@@ -33,6 +33,13 @@ enum DeserializerPosition {
33
33
}
34
34
35
35
impl < ' de > Deserializer < ' de > {
36
+ /// When used as a name hint to [de::Deserialize.deserialize_enum], the BSON deserializer will
37
+ /// report documents a byte array view instead of parsing them.
38
+ ///
39
+ /// This is used as an internal optimization when we want to keep a reference to a BSON sub-
40
+ /// document without actually inspecting the structure of that document.
41
+ pub const SPECIAL_CASE_EMBEDDED_DOCUMENT : & ' static str = "\0 SpecialCaseEmbedDoc" ;
42
+
36
43
pub fn outside_of_document ( parser : Parser < ' de > ) -> Self {
37
44
Self {
38
45
parser,
@@ -74,13 +81,13 @@ impl<'de> Deserializer<'de> {
74
81
}
75
82
}
76
83
77
- fn object_reader ( & mut self ) -> Result < BsonObject < ' de > , BsonError > {
84
+ fn object_reader ( & mut self ) -> Result < Deserializer < ' de > , BsonError > {
78
85
let parser = self . parser . document_scope ( ) ?;
79
86
let deserializer = Deserializer {
80
87
parser,
81
88
position : DeserializerPosition :: BeforeTypeOrAtEndOfDocument ,
82
89
} ;
83
- Ok ( BsonObject { de : deserializer } )
90
+ Ok ( deserializer)
84
91
}
85
92
86
93
fn advance_to_next_name ( & mut self ) -> Result < Option < ( ) > , BsonError > {
@@ -98,6 +105,10 @@ impl<'de> Deserializer<'de> {
98
105
impl < ' de , ' a > de:: Deserializer < ' de > for & ' a mut Deserializer < ' de > {
99
106
type Error = BsonError ;
100
107
108
+ fn is_human_readable ( & self ) -> bool {
109
+ false
110
+ }
111
+
101
112
fn deserialize_any < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
102
113
where
103
114
V : Visitor < ' de > ,
@@ -108,12 +119,12 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
108
119
ElementType :: Double => visitor. visit_f64 ( self . parser . read_double ( ) ?) ,
109
120
ElementType :: String => visitor. visit_borrowed_str ( self . parser . read_string ( ) ?) ,
110
121
ElementType :: Document => {
111
- let object = self . object_reader ( ) ?;
112
- visitor. visit_map ( object)
122
+ let mut object = self . object_reader ( ) ?;
123
+ visitor. visit_map ( & mut object)
113
124
}
114
125
ElementType :: Array => {
115
- let object = self . object_reader ( ) ?;
116
- visitor. visit_seq ( object)
126
+ let mut object = self . object_reader ( ) ?;
127
+ visitor. visit_seq ( & mut object)
117
128
}
118
129
ElementType :: Binary => {
119
130
let ( _, bytes) = self . parser . read_binary ( ) ?;
@@ -150,13 +161,26 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
150
161
V : Visitor < ' de > ,
151
162
{
152
163
let kind = self . prepare_to_read_value ( ) ?;
164
+
165
+ // With this special name, the visitor indicates that it doesn't actually want to read an
166
+ // enum, it wants to read values regularly. Except that a document appearing at this
167
+ // position should not be parsed, it should be forwarded as an embedded byte array.
168
+ if name == Deserializer :: SPECIAL_CASE_EMBEDDED_DOCUMENT {
169
+ return if matches ! ( kind, ElementType :: Document ) {
170
+ let object = self . object_reader ( ) ?;
171
+ visitor. visit_borrowed_bytes ( object. parser . remaining ( ) )
172
+ } else {
173
+ self . deserialize_any ( visitor)
174
+ } ;
175
+ }
176
+
153
177
match kind {
154
178
ElementType :: String => {
155
179
visitor. visit_enum ( self . parser . read_string ( ) ?. into_deserializer ( ) )
156
180
}
157
181
ElementType :: Document => {
158
182
let mut object = self . object_reader ( ) ?;
159
- visitor. visit_enum ( object)
183
+ visitor. visit_enum ( & mut object)
160
184
}
161
185
_ => Err ( self . parser . error ( ErrorKind :: ExpectedEnum { actual : kind } ) ) ,
162
186
}
@@ -180,96 +204,91 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
180
204
}
181
205
}
182
206
183
- struct BsonObject < ' de > {
184
- de : Deserializer < ' de > ,
185
- }
186
-
187
- impl < ' de > MapAccess < ' de > for BsonObject < ' de > {
207
+ impl < ' de > MapAccess < ' de > for Deserializer < ' de > {
188
208
type Error = BsonError ;
189
209
190
210
fn next_key_seed < K > ( & mut self , seed : K ) -> Result < Option < K :: Value > , Self :: Error >
191
211
where
192
212
K : DeserializeSeed < ' de > ,
193
213
{
194
- if let None = self . de . advance_to_next_name ( ) ? {
214
+ if let None = self . advance_to_next_name ( ) ? {
195
215
return Ok ( None ) ;
196
216
}
197
- Ok ( Some ( seed. deserialize ( & mut self . de ) ?) )
217
+ Ok ( Some ( seed. deserialize ( self ) ?) )
198
218
}
199
219
200
220
fn next_value_seed < V > ( & mut self , seed : V ) -> Result < V :: Value , Self :: Error >
201
221
where
202
222
V : DeserializeSeed < ' de > ,
203
223
{
204
- seed. deserialize ( & mut self . de )
224
+ seed. deserialize ( self )
205
225
}
206
226
}
207
227
208
- impl < ' de > SeqAccess < ' de > for BsonObject < ' de > {
228
+ impl < ' de > SeqAccess < ' de > for Deserializer < ' de > {
209
229
type Error = BsonError ;
210
230
211
231
fn next_element_seed < T > ( & mut self , seed : T ) -> Result < Option < T :: Value > , Self :: Error >
212
232
where
213
233
T : DeserializeSeed < ' de > ,
214
234
{
215
235
// Array elements are encoded as an object like `{"0": value, "1": another}`
216
- if let None = self . de . advance_to_next_name ( ) ? {
236
+ if let None = self . advance_to_next_name ( ) ? {
217
237
return Ok ( None ) ;
218
238
}
219
239
220
240
// Skip name
221
- debug_assert_matches ! ( self . de . position, DeserializerPosition :: BeforeName { .. } ) ;
222
- self . de . read_entry_key ( ) ?;
241
+ debug_assert_matches ! ( self . position, DeserializerPosition :: BeforeName { .. } ) ;
242
+ self . read_entry_key ( ) ?;
223
243
224
244
// And deserialize value!
225
- Ok ( Some ( seed. deserialize ( & mut self . de ) ?) )
245
+ Ok ( Some ( seed. deserialize ( self ) ?) )
226
246
}
227
247
}
228
248
229
- impl < ' de > EnumAccess < ' de > for BsonObject < ' de > {
249
+ impl < ' a , ' de > EnumAccess < ' de > for & ' a mut Deserializer < ' de > {
230
250
type Error = BsonError ;
231
251
type Variant = Self ;
232
252
233
- fn variant_seed < V > ( mut self , seed : V ) -> Result < ( V :: Value , Self :: Variant ) , Self :: Error >
253
+ fn variant_seed < V > ( self , seed : V ) -> Result < ( V :: Value , Self :: Variant ) , Self :: Error >
234
254
where
235
255
V : DeserializeSeed < ' de > ,
236
256
{
237
- if let None = self . de . advance_to_next_name ( ) ? {
257
+ if let None = self . advance_to_next_name ( ) ? {
238
258
return Err ( self
239
- . de
240
259
. parser
241
260
. error ( ErrorKind :: UnexpectedEndOfDocumentForEnumVariant ) ) ;
242
261
}
243
262
244
- let value = seed. deserialize ( & mut self . de ) ?;
263
+ let value = seed. deserialize ( & mut * self ) ?;
245
264
Ok ( ( value, self ) )
246
265
}
247
266
}
248
267
249
- impl < ' de > VariantAccess < ' de > for BsonObject < ' de > {
268
+ impl < ' a , ' de > VariantAccess < ' de > for & ' a mut Deserializer < ' de > {
250
269
type Error = BsonError ;
251
270
252
271
fn unit_variant ( self ) -> Result < ( ) , Self :: Error > {
253
272
// Unit variants are encoded as simple string values, which are handled directly in
254
273
// Deserializer::deserialize_enum.
255
- Err ( self . de . parser . error ( ErrorKind :: ExpectedString ) )
274
+ Err ( self . parser . error ( ErrorKind :: ExpectedString ) )
256
275
}
257
276
258
- fn newtype_variant_seed < T > ( mut self , seed : T ) -> Result < T :: Value , Self :: Error >
277
+ fn newtype_variant_seed < T > ( self , seed : T ) -> Result < T :: Value , Self :: Error >
259
278
where
260
279
T : DeserializeSeed < ' de > ,
261
280
{
262
281
// Newtype variants are represented as `{ NAME: VALUE }`, so we just have to deserialize the
263
282
// value here.
264
- seed. deserialize ( & mut self . de )
283
+ seed. deserialize ( self )
265
284
}
266
285
267
- fn tuple_variant < V > ( mut self , len : usize , visitor : V ) -> Result < V :: Value , Self :: Error >
286
+ fn tuple_variant < V > ( self , len : usize , visitor : V ) -> Result < V :: Value , Self :: Error >
268
287
where
269
288
V : Visitor < ' de > ,
270
289
{
271
290
// Tuple variants are represented as `{ NAME: VALUES[] }`, so we deserialize the array here.
272
- de:: Deserializer :: deserialize_seq ( & mut self . de , visitor)
291
+ de:: Deserializer :: deserialize_seq ( self , visitor)
273
292
}
274
293
275
294
fn struct_variant < V > (
@@ -281,6 +300,6 @@ impl<'de> VariantAccess<'de> for BsonObject<'de> {
281
300
V : Visitor < ' de > ,
282
301
{
283
302
// Struct variants are represented as `{ NAME: { ... } }`, so we deserialize the struct.
284
- de:: Deserializer :: deserialize_map ( & mut self . de , visitor)
303
+ de:: Deserializer :: deserialize_map ( self , visitor)
285
304
}
286
305
}
0 commit comments