1use std::{collections::HashMap, fmt};
2
3use serde::{
4 Deserialize, Serialize,
5 de::{MapAccess, SeqAccess, Visitor},
6};
7
8use crate::Value;
9
10impl Serialize for Value {
11 #[inline]
12 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
13 where
14 S: serde::Serializer,
15 {
16 match self {
17 Self::Null => serializer.serialize_unit(),
18 Self::Bool(b) => serializer.serialize_bool(*b),
19 Self::Number(f) => serializer.serialize_f64(*f),
20 Self::String(s) => serializer.serialize_str(s),
21 Self::ByteString(v) => serializer.serialize_bytes(v),
22 Self::Array(v) => v.serialize(serializer),
23 Self::Object(m) => m.serialize(serializer),
24 }
25 }
26}
27
28impl<'de> Deserialize<'de> for Value {
29 #[inline]
30 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
31 where
32 D: serde::Deserializer<'de>,
33 {
34 struct ValueVisitor;
35
36 impl<'de> Visitor<'de> for ValueVisitor {
37 type Value = Value;
38
39 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
40 formatter.write_str("any valid MASON value")
41 }
42
43 #[inline]
44 fn visit_bool<E>(self, value: bool) -> Result<Value, E> {
45 Ok(Value::Bool(value))
46 }
47
48 #[inline]
49 fn visit_i64<E>(self, value: i64) -> Result<Value, E>
50 where
51 E: serde::de::Error,
52 {
53 const MAX: i64 = 2i64.pow(f64::MANTISSA_DIGITS) + 1;
55
56 if value.abs() <= MAX {
57 Ok(Value::Number(value as f64))
58 } else {
59 Err(serde::de::Error::invalid_value(
60 serde::de::Unexpected::Signed(value),
61 &self,
62 ))
63 }
64 }
65
66 #[inline]
67 fn visit_i128<E>(self, value: i128) -> Result<Value, E>
68 where
69 E: serde::de::Error,
70 {
71 const MAX: i128 = 2i128.pow(f64::MANTISSA_DIGITS) + 1;
73
74 if value.abs() <= MAX {
75 Ok(Value::Number(value as f64))
76 } else {
77 Err(serde::de::Error::invalid_value(
78 serde::de::Unexpected::Other(&format!("integer `{value}` as i128")),
79 &self,
80 ))
81 }
82 }
83
84 #[inline]
85 fn visit_u64<E>(self, value: u64) -> Result<Value, E>
86 where
87 E: serde::de::Error,
88 {
89 const MAX: u64 = 2u64.pow(f64::MANTISSA_DIGITS) + 1;
91
92 if value <= MAX {
93 Ok(Value::Number(value as f64))
94 } else {
95 Err(serde::de::Error::invalid_value(
96 serde::de::Unexpected::Unsigned(value),
97 &self,
98 ))
99 }
100 }
101
102 #[inline]
103 fn visit_u128<E>(self, value: u128) -> Result<Value, E>
104 where
105 E: serde::de::Error,
106 {
107 const MAX: u128 = 2u128.pow(f64::MANTISSA_DIGITS) + 1;
109
110 if value <= MAX {
111 Ok(Value::Number(value as f64))
112 } else {
113 Err(serde::de::Error::invalid_value(
114 serde::de::Unexpected::Other(&format!("integer `{value}` as u128")),
115 &self,
116 ))
117 }
118 }
119
120 #[inline]
121 fn visit_f64<E>(self, value: f64) -> Result<Value, E> {
122 Ok(Value::Number(value))
123 }
124
125 #[inline]
126 fn visit_str<E>(self, value: &str) -> Result<Value, E>
127 where
128 E: serde::de::Error,
129 {
130 self.visit_string(String::from(value))
131 }
132
133 #[inline]
134 fn visit_string<E>(self, value: String) -> Result<Value, E> {
135 Ok(Value::String(value))
136 }
137
138 fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E> {
139 Ok(Value::ByteString(v.to_vec()))
140 }
141
142 fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E> {
143 Ok(Value::ByteString(v))
144 }
145
146 #[inline]
147 fn visit_none<E>(self) -> Result<Value, E> {
148 Ok(Value::Null)
149 }
150
151 #[inline]
152 fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error>
153 where
154 D: serde::Deserializer<'de>,
155 {
156 Deserialize::deserialize(deserializer)
157 }
158
159 #[inline]
160 fn visit_unit<E>(self) -> Result<Value, E> {
161 Ok(Value::Null)
162 }
163
164 #[inline]
165 fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error>
166 where
167 V: SeqAccess<'de>,
168 {
169 let mut vec = Vec::new();
170
171 while let Some(elem) = visitor.next_element()? {
172 vec.push(elem);
173 }
174
175 Ok(Value::Array(vec))
176 }
177
178 fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error>
179 where
180 V: MapAccess<'de>,
181 {
182 let mut values = HashMap::new();
183
184 while let Some((key, value)) = visitor.next_entry()? {
185 values.insert(key, value);
186 }
187
188 Ok(Value::Object(values))
189 }
190 }
191
192 deserializer.deserialize_any(ValueVisitor)
193 }
194}