Use serde feature flag instead of serialize.

The old one is still supported.
This commit is contained in:
Alex Orlenko
2025-06-12 13:35:22 +01:00
parent 2fbbbe4238
commit 7bc72be7d3
20 changed files with 94 additions and 91 deletions
+2 -2
View File
@@ -1,4 +1,4 @@
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use serde::ser::{Serialize, Serializer};
use crate::types::ValueRef;
@@ -73,7 +73,7 @@ impl Buffer {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for Buffer {
fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
serializer.serialize_bytes(unsafe { self.as_slice() })
+8 -8
View File
@@ -183,12 +183,12 @@ pub enum Error {
/// and returned again.
PreviouslyResumedPanic,
/// Serialization error.
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
SerializeError(StdString),
/// Deserialization error.
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
DeserializeError(StdString),
/// A custom error.
///
@@ -309,11 +309,11 @@ impl fmt::Display for Error {
Error::PreviouslyResumedPanic => {
write!(fmt, "previously resumed panic returned again")
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Error::SerializeError(err) => {
write!(fmt, "serialize error: {err}")
},
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Error::DeserializeError(err) => {
write!(fmt, "deserialize error: {err}")
},
@@ -494,14 +494,14 @@ impl From<Utf8Error> for Error {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl serde::ser::Error for Error {
fn custom<T: fmt::Display>(msg: T) -> Self {
Self::SerializeError(msg.to_string())
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl serde::de::Error for Error {
fn custom<T: fmt::Display>(msg: T) -> Self {
Self::DeserializeError(msg.to_string())
+4 -4
View File
@@ -35,7 +35,7 @@
//! The [`Value`] enum and other types implement [`serde::Serialize`] trait to support serializing
//! Lua values into Rust values.
//!
//! Requires `feature = "serialize"`.
//! Requires `feature = "serde"`.
//!
//! # Async/await support
//!
@@ -140,12 +140,12 @@ pub use crate::{
#[cfg_attr(docsrs, doc(cfg(feature = "async")))]
pub use crate::{thread::AsyncThread, traits::LuaNativeAsyncFn};
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
#[doc(inline)]
pub use crate::serde::{de::Options as DeserializeOptions, ser::Options as SerializeOptions, LuaSerdeExt};
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
pub mod serde;
#[cfg(feature = "mlua_derive")]
+1 -1
View File
@@ -32,7 +32,7 @@ pub use crate::{
#[doc(no_inline)]
pub use crate::{AsyncThread as LuaAsyncThread, LuaNativeAsyncFn};
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
#[doc(no_inline)]
pub use crate::{
DeserializeOptions as LuaDeserializeOptions, LuaSerdeExt, SerializeOptions as LuaSerializeOptions,
+1 -1
View File
@@ -13,7 +13,7 @@ use crate::util::check_stack;
use crate::value::Value;
/// Trait for serializing/deserializing Lua values using Serde.
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
pub trait LuaSerdeExt: Sealed {
/// A special value (lightuserdata) to encode/decode optional (none) values.
///
+5 -5
View File
@@ -39,7 +39,7 @@ use {
std::future::{self, Future},
};
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use serde::Serialize;
pub(crate) use extra::ExtraData;
@@ -1367,8 +1367,8 @@ impl Lua {
}
/// Creates a Lua userdata object from a custom serializable userdata type.
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
#[inline]
pub fn create_ser_userdata<T>(&self, data: T) -> Result<AnyUserData>
where
@@ -1395,8 +1395,8 @@ impl Lua {
/// Creates a Lua userdata object from a custom serializable Rust type.
///
/// See [`Lua::create_any_userdata`] for more details.
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
#[inline]
pub fn create_ser_any_userdata<T>(&self, data: T) -> Result<AnyUserData>
where
+1 -1
View File
@@ -208,7 +208,7 @@ impl RawLua {
}
// Init serde metatables
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
crate::serde::init_metatables(state)?;
Ok::<_, Error>(())
+2 -2
View File
@@ -11,7 +11,7 @@ use crate::traits::IntoLua;
use crate::types::{LuaType, ValueRef};
use crate::value::Value;
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use {
serde::ser::{Serialize, Serializer},
std::result::Result as StdResult,
@@ -211,7 +211,7 @@ impl Hash for String {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for String {
fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
where
+6 -6
View File
@@ -15,7 +15,7 @@ use crate::value::{Nil, Value};
#[cfg(feature = "async")]
use futures_util::future::{self, Either, Future};
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use {
rustc_hash::FxHashSet,
serde::ser::{Serialize, SerializeMap, SerializeSeq, Serializer},
@@ -735,7 +735,7 @@ impl Table {
Ok(())
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
pub(crate) fn is_array(&self) -> bool {
let lua = self.0.lua.lock();
let state = lua.state();
@@ -954,14 +954,14 @@ impl ObjectLike for Table {
}
/// A wrapped [`Table`] with customized serialization behavior.
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
pub(crate) struct SerializableTable<'a> {
table: &'a Table,
options: crate::serde::de::Options,
visited: Rc<RefCell<FxHashSet<*const c_void>>>,
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for Table {
#[inline]
fn serialize<S: Serializer>(&self, serializer: S) -> StdResult<S::Ok, S::Error> {
@@ -969,7 +969,7 @@ impl Serialize for Table {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl<'a> SerializableTable<'a> {
#[inline]
pub(crate) fn new(
@@ -985,7 +985,7 @@ impl<'a> SerializableTable<'a> {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for SerializableTable<'_> {
fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
where
+5 -5
View File
@@ -18,7 +18,7 @@ use crate::value::Value;
#[cfg(feature = "async")]
use std::future::Future;
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use {
serde::ser::{self, Serialize, Serializer},
std::result::Result as StdResult,
@@ -957,7 +957,7 @@ impl AnyUserData {
/// Returns `true` if this [`AnyUserData`] is serializable (e.g. was created using
/// [`Lua::create_ser_userdata`]).
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
pub(crate) fn is_serializable(&self) -> bool {
let lua = self.0.lua.lock();
let is_serializable = || unsafe {
@@ -1041,7 +1041,7 @@ where
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for AnyUserData {
fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
where
@@ -1072,8 +1072,8 @@ impl AnyUserData {
/// [`IntoLua`] trait.
///
/// This function uses [`Lua::create_ser_any_userdata`] under the hood.
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
pub fn wrap_ser<T: Serialize + MaybeSend + 'static>(data: T) -> impl IntoLua {
WrappedUserdata(move |lua| lua.create_ser_any_userdata(data))
}
+12 -12
View File
@@ -1,6 +1,6 @@
use std::cell::{RefCell, UnsafeCell};
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use serde::ser::{Serialize, Serializer};
use crate::error::{Error, Result};
@@ -9,10 +9,10 @@ use crate::types::XRc;
use super::lock::{RawLock, UserDataLock};
use super::r#ref::{UserDataRef, UserDataRefMut};
#[cfg(all(feature = "serialize", not(feature = "send")))]
#[cfg(all(feature = "serde", not(feature = "send")))]
type DynSerialize = dyn erased_serde::Serialize;
#[cfg(all(feature = "serialize", feature = "send"))]
#[cfg(all(feature = "serde", feature = "send"))]
type DynSerialize = dyn erased_serde::Serialize + Send;
pub(crate) enum UserDataStorage<T> {
@@ -24,7 +24,7 @@ pub(crate) enum UserDataStorage<T> {
// It's stored inside a Lua VM and protected by the outer `ReentrantMutex`.
pub(crate) enum UserDataVariant<T> {
Default(XRc<UserDataCell<T>>),
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Serializable(XRc<UserDataCell<Box<DynSerialize>>>, bool), // bool is `is_sync`
}
@@ -33,7 +33,7 @@ impl<T> Clone for UserDataVariant<T> {
fn clone(&self) -> Self {
match self {
Self::Default(inner) => Self::Default(XRc::clone(inner)),
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Self::Serializable(inner, is_sync) => Self::Serializable(XRc::clone(inner), *is_sync),
}
}
@@ -79,7 +79,7 @@ impl<T> UserDataVariant<T> {
}
Ok(match self {
Self::Default(inner) => XRc::into_inner(inner).unwrap().value.into_inner(),
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Self::Serializable(inner, _) => unsafe {
let raw = Box::into_raw(XRc::into_inner(inner).unwrap().value.into_inner());
*Box::from_raw(raw as *mut T)
@@ -91,7 +91,7 @@ impl<T> UserDataVariant<T> {
fn strong_count(&self) -> usize {
match self {
Self::Default(inner) => XRc::strong_count(inner),
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Self::Serializable(inner, _) => XRc::strong_count(inner),
}
}
@@ -100,7 +100,7 @@ impl<T> UserDataVariant<T> {
pub(super) fn raw_lock(&self) -> &RawLock {
match self {
Self::Default(inner) => &inner.raw_lock,
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Self::Serializable(inner, _) => &inner.raw_lock,
}
}
@@ -109,13 +109,13 @@ impl<T> UserDataVariant<T> {
pub(super) fn as_ptr(&self) -> *mut T {
match self {
Self::Default(inner) => inner.value.get(),
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
Self::Serializable(inner, _) => unsafe { &mut **(inner.value.get() as *mut Box<T>) },
}
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for UserDataStorage<()> {
fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
match self {
@@ -197,7 +197,7 @@ impl<T: 'static> UserDataStorage<T> {
Self::Scoped(ScopedUserDataVariant::RefMut(RefCell::new(data)))
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
#[inline(always)]
pub(crate) fn new_ser(data: T) -> Self
where
@@ -209,7 +209,7 @@ impl<T: 'static> UserDataStorage<T> {
Self::Owned(variant)
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
#[inline(always)]
pub(crate) fn is_serializable(&self) -> bool {
matches!(self, Self::Owned(UserDataVariant::Serializable(..)))
+8 -8
View File
@@ -15,7 +15,7 @@ use crate::types::{Integer, LightUserData, Number, ValueRef};
use crate::userdata::AnyUserData;
use crate::util::{check_stack, StackGuard};
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use {
crate::table::SerializableTable,
rustc_hash::FxHashSet,
@@ -481,8 +481,8 @@ impl Value {
/// Wrap reference to this Value into [`SerializableValue`].
///
/// This allows customizing serialization behavior using serde.
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
#[doc(hidden)]
pub fn to_serializable(&self) -> SerializableValue {
SerializableValue::new(self, Default::default(), None)
@@ -630,8 +630,8 @@ impl PartialEq for Value {
}
/// A wrapped [`Value`] with customized serialization behavior.
#[cfg(feature = "serialize")]
#[cfg_attr(docsrs, doc(cfg(feature = "serialize")))]
#[cfg(feature = "serde")]
#[cfg_attr(docsrs, doc(cfg(feature = "serde")))]
pub struct SerializableValue<'a> {
value: &'a Value,
options: crate::serde::de::Options,
@@ -639,7 +639,7 @@ pub struct SerializableValue<'a> {
visited: Option<Rc<RefCell<FxHashSet<*const c_void>>>>,
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for Value {
#[inline]
fn serialize<S: Serializer>(&self, serializer: S) -> StdResult<S::Ok, S::Error> {
@@ -647,7 +647,7 @@ impl Serialize for Value {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl<'a> SerializableValue<'a> {
#[inline]
pub(crate) fn new(
@@ -711,7 +711,7 @@ impl<'a> SerializableValue<'a> {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for SerializableValue<'_> {
fn serialize<S>(&self, serializer: S) -> StdResult<S::Ok, S::Error>
where
+2 -2
View File
@@ -1,6 +1,6 @@
use std::fmt;
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
use serde::ser::{Serialize, SerializeTupleStruct, Serializer};
/// A Luau vector type.
@@ -66,7 +66,7 @@ impl Vector {
}
}
#[cfg(feature = "serialize")]
#[cfg(feature = "serde")]
impl Serialize for Vector {
fn serialize<S: Serializer>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error> {
let mut ts = serializer.serialize_tuple_struct("Vector", Self::SIZE)?;