1use std::{any::Any, sync::Arc};
2
3#[derive(Clone, Debug, Default)]
6pub struct UserData {
7    pub data: Option<Arc<dyn Any + Send + Sync>>,
10}
11
12impl UserData {
13    pub fn new(user_info: impl Any + Send + Sync) -> Self {
15        Self {
16            data: Some(Arc::new(user_info)),
17        }
18    }
19}
20
21impl PartialEq for UserData {
22    fn eq(&self, other: &Self) -> bool {
23        match (&self.data, &other.data) {
24            (Some(a), Some(b)) => Arc::ptr_eq(a, b),
25            (None, None) => true,
26            _ => false,
27        }
28    }
29}
30
31impl Eq for UserData {}
32
33impl std::hash::Hash for UserData {
34    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
35        self.data.as_ref().map(Arc::as_ptr).hash(state);
36    }
37}
38
39#[cfg(feature = "serde")]
40impl serde::Serialize for UserData {
41    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
42    where
43        S: serde::Serializer,
44    {
45        serializer.serialize_none() }
47}
48
49#[cfg(feature = "serde")]
50impl<'de> serde::Deserialize<'de> for UserData {
51    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
52    where
53        D: serde::Deserializer<'de>,
54    {
55        struct UserDataVisitor;
56
57        impl serde::de::Visitor<'_> for UserDataVisitor {
58            type Value = UserData;
59
60            fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
61                formatter.write_str("a None value")
62            }
63
64            fn visit_none<E>(self) -> Result<UserData, E>
65            where
66                E: serde::de::Error,
67            {
68                Ok(UserData::default())
69            }
70        }
71
72        deserializer.deserialize_option(UserDataVisitor)
73    }
74}