Skip to main content

aiway_protocol/
single.rs

1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2use std::cell::UnsafeCell;
3use std::fmt::{Debug, Display};
4
5/// 一个具有内部可变性的单值容器
6pub struct SingleValue<T> {
7    value: UnsafeCell<Option<T>>,
8}
9
10impl<T: Display> Display for SingleValue<T> {
11    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12        let value = self.get();
13        if value.is_none() {
14            return write!(f, "None");
15        }
16        write!(f, "{}", value.unwrap())
17    }
18}
19
20unsafe impl<T: Send> Send for SingleValue<T> {}
21unsafe impl<T: Send> Sync for SingleValue<T> {}
22
23impl<T> SingleValue<T> {
24    pub fn new(value: T) -> Self {
25        Self {
26            value: UnsafeCell::new(Some(value)),
27        }
28    }
29
30    pub fn empty() -> Self {
31        Self {
32            value: UnsafeCell::new(None),
33        }
34    }
35
36    pub fn set(&self, value: T) {
37        unsafe {
38            *self.value.get() = Some(value);
39        }
40    }
41
42    #[inline]
43    pub fn get(&self) -> Option<&T> {
44        unsafe { (*self.value.get()).as_ref() }
45    }
46
47    #[inline]
48    #[allow(unused)]
49    pub fn take(&self) -> Option<T> {
50        unsafe {
51            let option_ref = &mut *self.value.get();
52            option_ref.take()
53        }
54    }
55
56    // #[inline]
57    // pub fn get_flat<U>(&self) -> Option<&U>
58    // where
59    //     T: AsRef<Option<U>>,
60    // {
61    //     self.get().and_then(|inner| inner.as_ref().as_ref())
62    // }
63}
64
65impl<T: Default> Default for SingleValue<T> {
66    #[inline]
67    fn default() -> Self {
68        Self::new(T::default())
69    }
70}
71
72impl From<String> for SingleValue<String> {
73    #[inline]
74    fn from(value: String) -> Self {
75        SingleValue::new(value)
76    }
77}
78
79impl From<&str> for SingleValue<String> {
80    #[inline]
81    fn from(value: &str) -> Self {
82        SingleValue::new(value.to_string())
83    }
84}
85
86impl<T: Serialize> Serialize for SingleValue<T> {
87    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
88    where
89        S: Serializer,
90    {
91        match self.get() {
92            Some(value) => value.serialize(serializer),
93            None => serializer.serialize_none(),
94        }
95    }
96}
97impl<'de, T> Deserialize<'de> for SingleValue<T>
98where
99    T: Deserialize<'de> + Default,
100{
101    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
102    where
103        D: Deserializer<'de>,
104    {
105        let value = T::deserialize(deserializer)?;
106        Ok(SingleValue::new(value))
107    }
108}
109
110impl<T: Debug> Debug for SingleValue<T> {
111    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
112        match self.get() {
113            Some(value) => write!(f, "SingleValue({:?})", value),
114            None => write!(f, "SingleValue(None)"),
115        }
116    }
117}