Skip to content

Commit ac315fd

Browse files
committed
Add AnyUserData::wrap_ser function
1 parent f95161c commit ac315fd

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/userdata.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,6 +1116,16 @@ impl AnyUserData {
11161116
pub fn wrap<T: MaybeSend + 'static>(data: T) -> impl IntoLua {
11171117
WrappedUserdata(move |lua| lua.create_any_userdata(data))
11181118
}
1119+
1120+
/// Wraps any Rust type that implements [`Serialize`], returning an opaque type that implements
1121+
/// [`IntoLua`] trait.
1122+
///
1123+
/// This function uses [`Lua::create_ser_any_userdata()`] under the hood.
1124+
#[cfg(feature = "serialize")]
1125+
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
1126+
pub fn wrap_ser<T: Serialize + MaybeSend + 'static>(data: T) -> impl IntoLua {
1127+
WrappedUserdata(move |lua| lua.create_ser_any_userdata(data))
1128+
}
11191129
}
11201130

11211131
impl<F> IntoLua for WrappedUserdata<F>

tests/serde.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use std::collections::HashMap;
44
use std::error::Error as StdError;
55

66
use mlua::{
7-
DeserializeOptions, Error, ExternalResult, Lua, LuaSerdeExt, Result as LuaResult, SerializeOptions,
8-
UserData, Value,
7+
AnyUserData, DeserializeOptions, Error, ExternalResult, IntoLua, Lua, LuaSerdeExt, Result as LuaResult,
8+
SerializeOptions, UserData, Value,
99
};
1010
use serde::{Deserialize, Serialize};
1111

@@ -72,18 +72,30 @@ fn test_serialize() -> Result<(), Box<dyn StdError>> {
7272
}
7373

7474
#[test]
75-
fn test_serialize_any_userdata() -> Result<(), Box<dyn StdError>> {
75+
fn test_serialize_any_userdata() {
7676
let lua = Lua::new();
7777

7878
let json_val = serde_json::json!({
7979
"a": 1,
8080
"b": "test",
8181
});
82-
let json_ud = lua.create_ser_any_userdata(json_val)?;
83-
let json_str = serde_json::to_string_pretty(&json_ud)?;
82+
let json_ud = lua.create_ser_any_userdata(json_val).unwrap();
83+
let json_str = serde_json::to_string_pretty(&json_ud).unwrap();
8484
assert_eq!(json_str, "{\n \"a\": 1,\n \"b\": \"test\"\n}");
85+
}
8586

86-
Ok(())
87+
#[test]
88+
fn test_serialize_wrapped_any_userdata() {
89+
let lua = Lua::new();
90+
91+
let json_val = serde_json::json!({
92+
"a": 1,
93+
"b": "test",
94+
});
95+
let ud = AnyUserData::wrap_ser(json_val);
96+
let json_ud = ud.into_lua(&lua).unwrap();
97+
let json_str = serde_json::to_string(&json_ud).unwrap();
98+
assert_eq!(json_str, "{\"a\":1,\"b\":\"test\"}");
8799
}
88100

89101
#[test]

0 commit comments

Comments
 (0)