1use serde::{Deserialize, Deserializer, Serialize, Serializer};
2use std::cell::UnsafeCell;
3use std::fmt::{Debug, Display};
4
5pub 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 }
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}