@@ -40,44 +40,51 @@ impl<'de> Deserializer<'de> {
40
40
/// document without actually inspecting the structure of that document.
41
41
pub const SPECIAL_CASE_EMBEDDED_DOCUMENT : & ' static str = "\0 SpecialCaseEmbedDoc" ;
42
42
43
- pub fn outside_of_document ( parser : Parser < ' de > ) -> Self {
43
+ fn outside_of_document ( parser : Parser < ' de > ) -> Self {
44
44
Self {
45
45
parser,
46
46
position : DeserializerPosition :: OutsideOfDocument ,
47
47
}
48
48
}
49
49
50
- /// Prepares to read a value without actually reading it, returning the [ElementType] of the
51
- /// upcoming key-value pair.
52
- fn prepare_to_read_value ( & mut self ) -> Result < ElementType , BsonError > {
50
+ pub fn from_bytes ( bytes : & ' de [ u8 ] ) -> Self {
51
+ let parser = Parser :: new ( bytes) ;
52
+ Self :: outside_of_document ( parser)
53
+ }
54
+
55
+ fn prepare_to_read ( & mut self , allow_key : bool ) -> Result < KeyOrValue < ' de > , BsonError > {
53
56
match self . position . clone ( ) {
54
57
DeserializerPosition :: OutsideOfDocument => {
55
58
// The next value we're reading is a document
56
59
self . position = DeserializerPosition :: BeforeValue {
57
60
pending_type : ElementType :: Document ,
58
61
} ;
59
- Ok ( ElementType :: Document )
62
+ Ok ( KeyOrValue :: PendingValue ( ElementType :: Document ) )
63
+ }
64
+ DeserializerPosition :: BeforeValue { pending_type } => {
65
+ Ok ( KeyOrValue :: PendingValue ( pending_type) )
60
66
}
61
- DeserializerPosition :: BeforeValue { pending_type } => Ok ( pending_type) ,
62
67
DeserializerPosition :: BeforeTypeOrAtEndOfDocument { .. } => {
63
68
Err ( self . parser . error ( ErrorKind :: InvalidStateExpectedType ) )
64
69
}
65
- DeserializerPosition :: BeforeName { .. } => {
66
- Err ( self . parser . error ( ErrorKind :: InvalidStateExpectedName ) )
67
- }
68
- }
69
- }
70
-
71
- /// If the deserializer is in a suitable position, read the upcoming key.
72
- fn read_entry_key ( & mut self ) -> Result < Option < & ' de str > , BsonError > {
73
- match self . position . clone ( ) {
74
70
DeserializerPosition :: BeforeName { pending_type } => {
71
+ if !allow_key {
72
+ return Err ( self . parser . error ( ErrorKind :: InvalidStateExpectedName ) ) ;
73
+ }
74
+
75
75
self . position = DeserializerPosition :: BeforeValue {
76
76
pending_type : pending_type,
77
77
} ;
78
- Ok ( Some ( self . parser . read_cstr ( ) ?) )
78
+ Ok ( KeyOrValue :: Key ( self . parser . read_cstr ( ) ?) )
79
79
}
80
- _ => Ok ( None ) ,
80
+ }
81
+ }
82
+
83
+ fn prepare_to_read_value ( & mut self ) -> Result < ElementType , BsonError > {
84
+ let result = self . prepare_to_read ( false ) ?;
85
+ match result {
86
+ KeyOrValue :: Key ( _) => unreachable ! ( ) ,
87
+ KeyOrValue :: PendingValue ( element_type) => Ok ( element_type) ,
81
88
}
82
89
}
83
90
@@ -113,7 +120,10 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
113
120
where
114
121
V : Visitor < ' de > ,
115
122
{
116
- let element_type = self . prepare_to_read_value ( ) ?;
123
+ let element_type = match self . prepare_to_read ( true ) ? {
124
+ KeyOrValue :: Key ( name) => return visitor. visit_borrowed_str ( name) ,
125
+ KeyOrValue :: PendingValue ( element_type) => element_type,
126
+ } ;
117
127
118
128
match element_type {
119
129
ElementType :: Double => visitor. visit_f64 ( self . parser . read_double ( ) ?) ,
@@ -133,24 +143,13 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
133
143
ElementType :: ObjectId => todo ! ( ) ,
134
144
ElementType :: Boolean => visitor. visit_bool ( self . parser . read_bool ( ) ?) ,
135
145
ElementType :: DatetimeUtc => todo ! ( ) ,
136
- ElementType :: Null | ElementType :: Undefined => visitor. visit_none ( ) ,
146
+ ElementType :: Null | ElementType :: Undefined => visitor. visit_unit ( ) ,
137
147
ElementType :: Int32 => visitor. visit_i32 ( self . parser . read_int32 ( ) ?) ,
138
148
ElementType :: Int64 => visitor. visit_i64 ( self . parser . read_int64 ( ) ?) ,
139
149
ElementType :: Timestamp => todo ! ( ) ,
140
150
}
141
151
}
142
152
143
- fn deserialize_identifier < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
144
- where
145
- V : Visitor < ' de > ,
146
- {
147
- let Some ( key) = self . read_entry_key ( ) ? else {
148
- return Err ( self . parser . error ( ErrorKind :: InvalidStateExpectedName ) ) ;
149
- } ;
150
-
151
- visitor. visit_borrowed_str ( key)
152
- }
153
-
154
153
fn deserialize_enum < V > (
155
154
self ,
156
155
name : & ' static str ,
@@ -200,7 +199,7 @@ impl<'de, 'a> de::Deserializer<'de> for &'a mut Deserializer<'de> {
200
199
forward_to_deserialize_any ! {
201
200
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
202
201
bytes byte_buf unit unit_struct newtype_struct seq tuple
203
- tuple_struct map struct ignored_any
202
+ tuple_struct map struct ignored_any identifier
204
203
}
205
204
}
206
205
@@ -239,7 +238,7 @@ impl<'de> SeqAccess<'de> for Deserializer<'de> {
239
238
240
239
// Skip name
241
240
debug_assert_matches ! ( self . position, DeserializerPosition :: BeforeName { .. } ) ;
242
- self . read_entry_key ( ) ?;
241
+ self . prepare_to_read ( true ) ?;
243
242
244
243
// And deserialize value!
245
244
Ok ( Some ( seed. deserialize ( self ) ?) )
@@ -303,3 +302,8 @@ impl<'a, 'de> VariantAccess<'de> for &'a mut Deserializer<'de> {
303
302
de:: Deserializer :: deserialize_map ( self , visitor)
304
303
}
305
304
}
305
+
306
+ enum KeyOrValue < ' de > {
307
+ Key ( & ' de str ) ,
308
+ PendingValue ( ElementType ) ,
309
+ }
0 commit comments