Add AnyUserData::wrap_ser function

This commit is contained in:
Alex Orlenko
2024-10-06 11:09:34 +01:00
parent f95161c6e0
commit ac315fd80b
2 changed files with 28 additions and 6 deletions
+10
View File
@@ -1116,6 +1116,16 @@ impl AnyUserData {
pub fn wrap<T: MaybeSend + 'static>(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<T: Serialize + MaybeSend + 'static>(data: T) -> impl IntoLua {
WrappedUserdata(move |lua| lua.create_ser_any_userdata(data))
}
}
impl<F> IntoLua for WrappedUserdata<F>
+18 -6
View File
@@ -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<dyn StdError>> {
}
#[test]
fn test_serialize_any_userdata() -> Result<(), Box<dyn StdError>> {
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]