diff --git a/src/userdata.rs b/src/userdata.rs index df299bf..5fa9766 100644 --- a/src/userdata.rs +++ b/src/userdata.rs @@ -1116,6 +1116,16 @@ impl AnyUserData { pub fn wrap(data: T) -> impl IntoLua { WrappedUserdata(move |lua| lua.create_any_userdata(data)) } + + /// Wraps any Rust type that implements [`Serialize`], returning an opaque type that implements + /// [`IntoLua`] trait. + /// + /// This function uses [`Lua::create_ser_any_userdata()`] under the hood. + #[cfg(feature = "serialize")] + #[cfg_attr(docsrs, doc(cfg(feature = "serialize")))] + pub fn wrap_ser(data: T) -> impl IntoLua { + WrappedUserdata(move |lua| lua.create_ser_any_userdata(data)) + } } impl IntoLua for WrappedUserdata diff --git a/tests/serde.rs b/tests/serde.rs index d3ed372..cafbe70 100644 --- a/tests/serde.rs +++ b/tests/serde.rs @@ -4,8 +4,8 @@ use std::collections::HashMap; use std::error::Error as StdError; use mlua::{ - DeserializeOptions, Error, ExternalResult, Lua, LuaSerdeExt, Result as LuaResult, SerializeOptions, - UserData, Value, + AnyUserData, DeserializeOptions, Error, ExternalResult, IntoLua, Lua, LuaSerdeExt, Result as LuaResult, + SerializeOptions, UserData, Value, }; use serde::{Deserialize, Serialize}; @@ -72,18 +72,30 @@ fn test_serialize() -> Result<(), Box> { } #[test] -fn test_serialize_any_userdata() -> Result<(), Box> { +fn test_serialize_any_userdata() { let lua = Lua::new(); let json_val = serde_json::json!({ "a": 1, "b": "test", }); - let json_ud = lua.create_ser_any_userdata(json_val)?; - let json_str = serde_json::to_string_pretty(&json_ud)?; + let json_ud = lua.create_ser_any_userdata(json_val).unwrap(); + let json_str = serde_json::to_string_pretty(&json_ud).unwrap(); assert_eq!(json_str, "{\n \"a\": 1,\n \"b\": \"test\"\n}"); +} - Ok(()) +#[test] +fn test_serialize_wrapped_any_userdata() { + let lua = Lua::new(); + + let json_val = serde_json::json!({ + "a": 1, + "b": "test", + }); + let ud = AnyUserData::wrap_ser(json_val); + let json_ud = ud.into_lua(&lua).unwrap(); + let json_str = serde_json::to_string(&json_ud).unwrap(); + assert_eq!(json_str, "{\"a\":1,\"b\":\"test\"}"); } #[test]