@@ -10,7 +10,10 @@ use std::sync::{Arc, Mutex};
10
10
11
11
use futures_util:: Future ;
12
12
use http:: HeaderMap ;
13
- use serde:: { de:: DeserializeOwned , Deserialize , Serialize } ;
13
+ use serde:: {
14
+ de:: { DeserializeOwned , IntoDeserializer } ,
15
+ Deserialize , Serialize ,
16
+ } ;
14
17
use serde_json:: Value as JsonValue ;
15
18
pub use serialize_to_javascript:: Options as SerializeOptions ;
16
19
use tauri_macros:: default_runtime;
@@ -89,7 +92,7 @@ impl InvokeBody {
89
92
pub fn deserialize < T : DeserializeOwned > ( self ) -> serde_json:: Result < T > {
90
93
match self {
91
94
InvokeBody :: Json ( v) => serde_json:: from_value ( v) ,
92
- InvokeBody :: Raw ( v) => serde_json :: from_slice ( & v ) ,
95
+ InvokeBody :: Raw ( v) => T :: deserialize ( v . into_deserializer ( ) ) ,
93
96
}
94
97
}
95
98
}
@@ -518,3 +521,28 @@ impl<R: Runtime> InvokeMessage<R> {
518
521
/// The `Callback` type is the return value of the `transformCallback` JavaScript function.
519
522
#[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash , Serialize , Deserialize ) ]
520
523
pub struct CallbackFn ( pub u32 ) ;
524
+
525
+ #[ cfg( test) ]
526
+ mod tests {
527
+ use super :: * ;
528
+
529
+ #[ test]
530
+ fn deserialize_invoke_body ( ) {
531
+ let json = InvokeBody :: Json ( serde_json:: Value :: Array ( vec ! [
532
+ serde_json:: Value :: Number ( 1 . into( ) ) ,
533
+ serde_json:: Value :: Number ( 123 . into( ) ) ,
534
+ serde_json:: Value :: Number ( 1231 . into( ) ) ,
535
+ ] ) ) ;
536
+ assert_eq ! ( json. deserialize:: <Vec <u16 >>( ) . unwrap( ) , vec![ 1 , 123 , 1231 ] ) ;
537
+
538
+ let json = InvokeBody :: Json ( serde_json:: Value :: String ( "string value" . into ( ) ) ) ;
539
+ assert_eq ! ( json. deserialize:: <String >( ) . unwrap( ) , "string value" ) ;
540
+
541
+ let json = InvokeBody :: Json ( serde_json:: Value :: String ( "string value" . into ( ) ) ) ;
542
+ assert ! ( json. deserialize:: <Vec <u16 >>( ) . is_err( ) ) ;
543
+
544
+ let values = vec ! [ 1 , 2 , 3 , 4 , 5 , 6 , 1 ] ;
545
+ let raw = InvokeBody :: Raw ( values. clone ( ) ) ;
546
+ assert_eq ! ( raw. deserialize:: <Vec <u8 >>( ) . unwrap( ) , values) ;
547
+ }
548
+ }
0 commit comments