From 62f0bb97b019081e286f7eb5eafe62f09519349e Mon Sep 17 00:00:00 2001 From: Alex Orlenko Date: Fri, 5 Apr 2024 12:03:40 +0100 Subject: [PATCH] Add `Lua::create_ser_any_userdata()` function --- src/lua.rs | 15 +++++++++++++++ tests/serde.rs | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/lua.rs b/src/lua.rs index 6691bf0..35bdf4b 100644 --- a/src/lua.rs +++ b/src/lua.rs @@ -1746,6 +1746,21 @@ impl Lua { unsafe { self.make_any_userdata(UserDataCell::new(data)) } } + /// Creates a Lua userdata object from a custom serializable Rust type. + /// + /// See [`Lua::create_any_userdata()`] for more details. + /// + /// Requires `feature = "serialize"` + #[cfg(feature = "serialize")] + #[cfg_attr(docsrs, doc(cfg(feature = "serialize")))] + #[inline] + pub fn create_ser_any_userdata(&self, data: T) -> Result + where + T: Serialize + MaybeSend + 'static, + { + unsafe { self.make_any_userdata(UserDataCell::new_ser(data)) } + } + /// Registers a custom Rust type in Lua to use in userdata objects. /// /// This methods provides a way to add fields or methods to userdata objects of a type `T`. diff --git a/tests/serde.rs b/tests/serde.rs index 9c287a4..1eabf42 100644 --- a/tests/serde.rs +++ b/tests/serde.rs @@ -115,6 +115,21 @@ fn test_serialize_in_scope() -> LuaResult<()> { Ok(()) } +#[test] +fn test_serialize_any_userdata() -> Result<(), Box> { + 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)?; + assert_eq!(json_str, "{\n \"a\": 1,\n \"b\": \"test\"\n}"); + + Ok(()) +} + #[test] fn test_serialize_failure() -> Result<(), Box> { #[derive(Serialize)]