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}