@@ -10,7 +10,10 @@ use std::sync::{Arc, Mutex};
1010
1111use futures_util:: Future ;
1212use http:: HeaderMap ;
13- use serde:: { de:: DeserializeOwned , Deserialize , Serialize } ;
13+ use serde:: {
14+ de:: { DeserializeOwned , IntoDeserializer } ,
15+ Deserialize , Serialize ,
16+ } ;
1417use serde_json:: Value as JsonValue ;
1518pub use serialize_to_javascript:: Options as SerializeOptions ;
1619use tauri_macros:: default_runtime;
@@ -89,7 +92,7 @@ impl InvokeBody {
8992 pub fn deserialize < T : DeserializeOwned > ( self ) -> serde_json:: Result < T > {
9093 match self {
9194 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 ( ) ) ,
9396 }
9497 }
9598}
@@ -518,3 +521,28 @@ impl<R: Runtime> InvokeMessage<R> {
518521/// The `Callback` type is the return value of the `transformCallback` JavaScript function.
519522#[ derive( Debug , Clone , Copy , Eq , PartialEq , Hash , Serialize , Deserialize ) ]
520523pub 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