Skip to content

Commit e93ca1d

Browse files
authored
fix(core): fix InvokeBody::Raw deserialization (#10138)
closes #9948
1 parent 2783836 commit e93ca1d

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"tauri": "patch:bug"
3+
---
4+
5+
Fix `InvokeBody::deserialize` method deserialization for `InvokeBody::Raw` variant

core/tauri/src/ipc/mod.rs

+30-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ use std::sync::{Arc, Mutex};
1010

1111
use futures_util::Future;
1212
use http::HeaderMap;
13-
use serde::{de::DeserializeOwned, Deserialize, Serialize};
13+
use serde::{
14+
de::{DeserializeOwned, IntoDeserializer},
15+
Deserialize, Serialize,
16+
};
1417
use serde_json::Value as JsonValue;
1518
pub use serialize_to_javascript::Options as SerializeOptions;
1619
use 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)]
520523
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

Comments
 (0)