1- use anyhow:: { anyhow, bail} ;
21use rquickjs:: {
3- Array , Exception , Filter , Object , String as JSString , Value ,
2+ Array , Exception , Filter , Function , Null , Object , String as JSString , Value ,
3+ atom:: PredefinedAtom ,
44 function:: This ,
55 object:: ObjectIter ,
66 qjs:: { JS_GetClassID , JS_GetProperty } ,
77} ;
8- use rquickjs:: { Function , Null , atom:: PredefinedAtom } ;
9- use serde:: de:: { self , Error as SerError } ;
10- use serde:: forward_to_deserialize_any;
8+ use serde:: { de, forward_to_deserialize_any} ;
119
1210use crate :: err:: { Error , Result } ;
1311use crate :: utils:: { as_key, to_string_lossy} ;
@@ -23,12 +21,6 @@ enum ClassId {
2321 BigInt = 33 ,
2422}
2523
26- impl SerError for Error {
27- fn custom < T : std:: fmt:: Display > ( e : T ) -> Self {
28- Error :: Custom ( anyhow ! ( e. to_string( ) ) )
29- }
30- }
31-
3224/// `Deserializer` is a deserializer for [Value] values, implementing the `serde::Deserializer` trait.
3325///
3426/// This struct is responsible for converting [Value], into Rust types using the Serde deserialization framework.
@@ -72,15 +64,15 @@ impl<'js> Deserializer<'js> {
7264 return visitor. visit_i32 (
7365 self . value
7466 . as_int ( )
75- . ok_or_else ( || anyhow ! ( "Failed to convert value to i32" ) ) ?,
67+ . ok_or_else ( || Error :: new ( "Failed to convert value to i32" ) ) ?,
7668 ) ;
7769 }
7870
7971 if self . value . is_float ( ) {
8072 let f64_representation = self
8173 . value
8274 . as_float ( )
83- . ok_or_else ( || anyhow ! ( "Failed to convert value to f64" ) ) ?;
75+ . ok_or_else ( || Error :: new ( "Failed to convert value to f64" ) ) ?;
8476 let is_positive = f64_representation. is_sign_positive ( ) ;
8577 let safe_integer_range = ( MIN_SAFE_INTEGER as f64 ) ..=( MAX_SAFE_INTEGER as f64 ) ;
8678 let whole = f64_representation. fract ( ) == 0.0 ;
@@ -104,7 +96,7 @@ impl<'js> Deserializer<'js> {
10496 let v = self
10597 . stack
10698 . pop ( )
107- . ok_or_else ( || anyhow ! ( "No entries found in the deserializer stack" ) ) ?;
99+ . ok_or_else ( || Error :: new ( "No entries found in the deserializer stack" ) ) ?;
108100 Ok ( v)
109101 }
110102
@@ -114,7 +106,7 @@ impl<'js> Deserializer<'js> {
114106 fn check_cycles ( & self ) -> Result < ( ) > {
115107 for val in self . stack . iter ( ) . rev ( ) {
116108 if self . value . eq ( val) {
117- return Err ( Error :: from ( Exception :: throw_type (
109+ return Err ( Error :: new ( Exception :: throw_type (
118110 val. ctx ( ) ,
119111 "circular dependency" ,
120112 ) ) ) ;
@@ -138,7 +130,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
138130 if get_class_id ( & self . value ) == ClassId :: Number as u32 {
139131 let value_of = get_valueof ( & self . value ) ;
140132 if let Some ( f) = value_of {
141- let v = f. call ( ( This ( self . value . clone ( ) ) , ) ) ?;
133+ let v = f. call ( ( This ( self . value . clone ( ) ) , ) ) . map_err ( Error :: new ) ?;
142134 self . value = v;
143135 return self . deserialize_number ( visitor) ;
144136 }
@@ -151,7 +143,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
151143 if get_class_id ( & self . value ) == ClassId :: Bool as u32 {
152144 let value_of = get_valueof ( & self . value ) ;
153145 if let Some ( f) = value_of {
154- let v = f. call ( ( This ( self . value . clone ( ) ) , ) ) ?;
146+ let v = f. call ( ( This ( self . value . clone ( ) ) , ) ) . map_err ( Error :: new ) ?;
155147 return visitor. visit_bool ( v) ;
156148 }
157149 }
@@ -163,7 +155,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
163155 if get_class_id ( & self . value ) == ClassId :: String as u32 {
164156 let value_of = get_to_string ( & self . value ) ;
165157 if let Some ( f) = value_of {
166- let v = f. call ( ( ( This ( self . value . clone ( ) ) ) , ) ) ?;
158+ let v = f. call ( ( ( This ( self . value . clone ( ) ) ) , ) ) . map_err ( Error :: new ) ?;
167159 self . value = v;
168160 }
169161 }
@@ -198,7 +190,7 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
198190 ensure_supported ( & self . value ) ?;
199191
200192 if let Some ( f) = get_to_json ( & self . value ) {
201- let v: Value = f. call ( ( This ( self . value . clone ( ) ) , ) ) ?;
193+ let v: Value = f. call ( ( This ( self . value . clone ( ) ) , ) ) . map_err ( Error :: new ) ?;
202194
203195 if v. is_undefined ( ) {
204196 self . value = Value :: new_undefined ( v. ctx ( ) . clone ( ) ) ;
@@ -218,13 +210,13 @@ impl<'de> de::Deserializer<'de> for &mut Deserializer<'de> {
218210 || self . value . type_of ( ) == rquickjs:: Type :: BigInt
219211 {
220212 if let Some ( f) = get_to_json ( & self . value ) {
221- let v: Value = f. call ( ( This ( self . value . clone ( ) ) , ) ) ?;
213+ let v: Value = f. call ( ( This ( self . value . clone ( ) ) , ) ) . map_err ( Error :: new ) ?;
222214 self . value = v;
223215 return self . deserialize_any ( visitor) ;
224216 }
225217 }
226218
227- Err ( Error :: from ( Exception :: throw_type (
219+ Err ( Error :: new ( Exception :: throw_type (
228220 self . value . ctx ( ) ,
229221 "Unsupported type" ,
230222 ) ) )
@@ -299,10 +291,12 @@ impl<'a, 'de> MapAccess<'a, 'de> {
299291
300292 /// Pops the top level value representing this sequence.
301293 /// Errors if a different value is popped.
302- fn pop ( & mut self ) -> anyhow :: Result < ( ) > {
294+ fn pop ( & mut self ) -> Result < ( ) > {
303295 let v = self . de . pop_visited ( ) ?;
304296 if v != self . obj . clone ( ) . into_value ( ) {
305- bail ! ( "Popped a mismatched value. Expected the top level sequence value" ) ;
297+ return Err ( Error :: new (
298+ "Popped a mismatched value. Expected the top level sequence value" ,
299+ ) ) ;
306300 }
307301
308302 Ok ( ( ) )
@@ -318,11 +312,11 @@ impl<'de> de::MapAccess<'de> for MapAccess<'_, 'de> {
318312 {
319313 loop {
320314 if let Some ( kv) = self . properties . next ( ) {
321- let ( k, v) = kv?;
315+ let ( k, v) = kv. map_err ( Error :: new ) ?;
322316
323317 let to_json = get_to_json ( & v) ;
324318 let v = if let Some ( f) = to_json {
325- f. call ( ( This ( v. clone ( ) ) , k. clone ( ) ) ) ?
319+ f. call ( ( This ( v. clone ( ) ) , k. clone ( ) ) ) . map_err ( Error :: new ) ?
326320 } else {
327321 v
328322 } ;
@@ -338,13 +332,13 @@ impl<'de> de::MapAccess<'de> for MapAccess<'_, 'de> {
338332 if class_id == ClassId :: Bool as u32 || class_id == ClassId :: Number as u32 {
339333 let value_of = get_valueof ( & v) ;
340334 if let Some ( f) = value_of {
341- let v = f. call ( ( This ( v. clone ( ) ) , ) ) ?;
335+ let v = f. call ( ( This ( v. clone ( ) ) , ) ) . map_err ( Error :: new ) ?;
342336 self . de . current_kv = Some ( ( k. clone ( ) , v) ) ;
343337 }
344338 } else if class_id == ClassId :: String as u32 {
345339 let to_string = get_to_string ( & v) ;
346340 if let Some ( f) = to_string {
347- let v = f. call ( ( This ( v. clone ( ) ) , ) ) ?;
341+ let v = f. call ( ( This ( v. clone ( ) ) , ) ) . map_err ( Error :: new ) ?;
348342 self . de . current_kv = Some ( ( k. clone ( ) , v) ) ;
349343 }
350344 } else {
@@ -393,15 +387,19 @@ impl<'a, 'de: 'a> SeqAccess<'a, 'de> {
393387 // using the bindings `Array::len` given that according to the spec
394388 // it's fine to return any value, not just a number from the
395389 // `length` property.
396- let value: Value = seq. as_object ( ) . get ( PredefinedAtom :: Length ) ?;
390+ let value: Value = seq
391+ . as_object ( )
392+ . get ( PredefinedAtom :: Length )
393+ . map_err ( Error :: new) ?;
397394 let length: usize = if value. is_number ( ) {
398395 value. as_number ( ) . unwrap ( ) as usize
399396 } else {
400397 let value_of: Function = value
401398 . as_object ( )
402399 . expect ( "length to be an object" )
403- . get ( PredefinedAtom :: ValueOf ) ?;
404- value_of. call ( ( ) ) ?
400+ . get ( PredefinedAtom :: ValueOf )
401+ . map_err ( Error :: new) ?;
402+ value_of. call ( ( ) ) . map_err ( Error :: new) ?
405403 } ;
406404
407405 Ok ( Self {
@@ -414,10 +412,12 @@ impl<'a, 'de: 'a> SeqAccess<'a, 'de> {
414412
415413 /// Pops the top level value representing this sequence.
416414 /// Errors if a different value is popped.
417- fn pop ( & mut self ) -> anyhow :: Result < ( ) > {
415+ fn pop ( & mut self ) -> Result < ( ) > {
418416 let v = self . de . pop_visited ( ) ?;
419417 if v != self . seq . clone ( ) . into_value ( ) {
420- bail ! ( "Popped a mismatched value. Expected the top level sequence value" ) ;
418+ return Err ( Error :: new (
419+ "Popped a mismatched value. Expected the top level sequence value" ,
420+ ) ) ;
421421 }
422422
423423 Ok ( ( ) )
@@ -432,12 +432,14 @@ impl<'de> de::SeqAccess<'de> for SeqAccess<'_, 'de> {
432432 T : de:: DeserializeSeed < ' de > ,
433433 {
434434 if self . index < self . length {
435- let el = self . seq . get ( self . index ) ?;
435+ let el = self . seq . get ( self . index ) . map_err ( Error :: new ) ?;
436436 let to_json = get_to_json ( & el) ;
437437
438438 if let Some ( f) = to_json {
439439 let index_value = JSString :: from_str ( el. ctx ( ) . clone ( ) , & self . index . to_string ( ) ) ;
440- self . de . value = f. call ( ( This ( el. clone ( ) ) , index_value) ) ?;
440+ self . de . value = f
441+ . call ( ( This ( el. clone ( ) ) , index_value) )
442+ . map_err ( Error :: new) ?;
441443 } else if ensure_supported ( & el) ? {
442444 self . de . value = el
443445 } else {
@@ -507,7 +509,7 @@ fn ensure_supported(value: &Value<'_>) -> Result<bool> {
507509 }
508510
509511 if class_id == ClassId :: BigInt as u32 {
510- return Err ( Error :: from ( Exception :: throw_type (
512+ return Err ( Error :: new ( Exception :: throw_type (
511513 value. ctx ( ) ,
512514 "BigInt not supported" ,
513515 ) ) ) ;
0 commit comments