use crate::{
de::Result as DeResult, ser::Result as SerResult, Deserialize, DeserializerTrait, Serialize,
SerializerTrait, Symbol, Visitor,
};
#[derive(Hash, PartialEq, Eq, Default, Debug, Clone)]
pub struct Userdata {
pub class: Symbol,
pub data: Vec<u8>,
}
impl Userdata {
#[allow(clippy::must_use_candidate)]
pub fn into_parts(self) -> (Symbol, Vec<u8>) {
(self.class, self.data)
}
}
struct UserdataVisitor;
impl<'de> Visitor<'de> for UserdataVisitor {
type Value = Userdata;
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter.write_str("an instance of user data")
}
fn visit_user_data(self, class: &'de crate::Sym, data: &'de [u8]) -> DeResult<Self::Value> {
Ok(Userdata {
class: class.to_symbol(),
data: data.to_vec(),
})
}
}
impl<'de> Deserialize<'de> for Userdata {
fn deserialize<D>(deserializer: D) -> DeResult<Self>
where
D: DeserializerTrait<'de>,
{
deserializer.deserialize(UserdataVisitor)
}
}
impl Serialize for Userdata {
fn serialize<S>(&self, serializer: S) -> SerResult<S::Ok>
where
S: SerializerTrait,
{
serializer.serialize_user_data(&self.class, &self.data)
}
}