1use std::collections::HashMap;
17use std::fmt;
18
19use serde::ser::{self, Error, SerializeSeq};
20use serde::de;
21
22use table::Table;
23use value::Value;
24
25pub fn to_value<T>(t: &T) -> Result<Value, SerializeError>
27where
28 T: ser::Serialize,
29{
30 t.serialize(ValueSerializer)
31}
32
33pub fn from_value<'de, T>(value: &'de Value) -> Result<T, DeserializeError>
35where
36 T: de::Deserialize<'de>,
37{
38 T::deserialize(value)
39}
40
41impl ser::Serialize for Value {
42 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
43 where
44 S: ser::Serializer,
45 {
46 match self {
47 Value::Null => serializer.serialize_none(),
48 Value::Boolean(x) => serializer.serialize_bool(*x),
49 Value::Integer(x) => serializer.serialize_i64(*x),
50 Value::Number(x) => serializer.serialize_f64(*x),
51 Value::Text(x) => serializer.serialize_str(x),
52 Value::List(x) => x.serialize(serializer),
53 Value::Table(x) => x.serialize(serializer),
54 }
55 }
56}
57
58impl<'de> de::Deserialize<'de> for Value {
59 fn deserialize<D>(deserializer: D) -> Result<Value, D::Error>
60 where
61 D: de::Deserializer<'de>,
62 {
63 struct ValueVisitor;
64 impl<'v> de::Visitor<'v> for ValueVisitor {
65 type Value = Value;
66
67 fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
68 write!(f, "a boolean, integer, float, string, array, or map")
69 }
70
71 fn visit_bool<E: de::Error>(self, x: bool) -> Result<Value, E> {
72 Ok(Value::Boolean(x))
73 }
74
75 fn visit_i64<E: de::Error>(self, x: i64) -> Result<Value, E> {
76 Ok(Value::Integer(x))
77 }
78
79 fn visit_u64<E: de::Error>(self, x: u64) -> Result<Value, E> {
80 if x <= i64::max_value() as u64 {
81 self.visit_i64(x as i64)
82 } else {
83 Err(E::invalid_value(
84 de::Unexpected::Unsigned(x),
85 &"an integer within the range -2**63..2**63",
86 ))
87 }
88 }
89
90 fn visit_f64<E: de::Error>(self, x: f64) -> Result<Value, E> {
91 Ok(Value::Number(x))
92 }
93
94 fn visit_str<E: de::Error>(self, x: &str) -> Result<Value, E> {
95 Ok(Value::Text(x.to_string()))
96 }
97
98 fn visit_none<E: de::Error>(self) -> Result<Value, E> {
99 Ok(Value::Null)
100 }
101
102 fn visit_some<D: de::Deserializer<'v>>(self, deserializer: D)
103 -> Result<Value, D::Error>
104 {
105 deserializer.deserialize_any(self)
106 }
107
108 fn visit_seq<A>(self, mut seq: A) -> Result<Value, A::Error>
109 where
110 A: de::SeqAccess<'v>,
111 {
112 let mut vec = Vec::new();
113 if let Some(size) = seq.size_hint() {
114 vec.reserve(size);
115 }
116 while let Some(v) = seq.next_element()? {
117 vec.push(v);
118 }
119 Ok(Value::List(vec))
120 }
121
122 fn visit_map<A>(self, mut map: A) -> Result<Value, A::Error>
123 where
124 A: de::MapAccess<'v>,
125 {
126 let mut hash_map = HashMap::new();
127 if let Some(size) = map.size_hint() {
128 hash_map.reserve(size);
129 }
130 while let Some((k, v)) = map.next_entry()? {
131 hash_map.insert(k, v);
132 }
133 Ok(Value::Table(Table::from(hash_map)))
134 }
135 }
136
137 deserializer.deserialize_any(ValueVisitor)
138 }
139}
140
141#[derive(Debug)]
142pub struct SerializeError {
143 description: String,
144}
145
146impl ::std::error::Error for SerializeError {}
147
148impl ser::Error for SerializeError {
149 fn custom<T>(msg: T) -> Self
150 where
151 T: fmt::Display,
152 {
153 SerializeError {
154 description: msg.to_string(),
155 }
156 }
157}
158
159impl fmt::Display for SerializeError {
160 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
161 f.write_str(&self.description)
162 }
163}
164
165pub struct ValueSerializer;
166
167pub struct ListSerializer {
168 buf: Vec<Value>,
169}
170
171pub struct TableSerializer {
172 buf: HashMap<String, Value>,
173 key: Option<String>,
174}
175
176pub struct ListVariantSerializer {
177 variant: &'static str,
178 buf: Vec<Value>,
179}
180
181pub struct TableVariantSerializer {
182 variant: &'static str,
183 buf: HashMap<String, Value>,
184}
185
186impl ser::Serializer for ValueSerializer {
187 type Ok = Value;
188 type Error = SerializeError;
189 type SerializeSeq = ListSerializer;
190 type SerializeTuple = ListSerializer;
191 type SerializeTupleStruct = ListSerializer;
192 type SerializeMap = TableSerializer;
193 type SerializeStruct = TableSerializer;
194 type SerializeTupleVariant = ListVariantSerializer;
195 type SerializeStructVariant = TableVariantSerializer;
196
197 fn serialize_bool(self, value: bool) -> Result<Self::Ok, Self::Error> {
198 Ok(Value::Boolean(value))
199 }
200
201 fn serialize_i8(self, value: i8) -> Result<Self::Ok, Self::Error> {
202 self.serialize_i64(value as i64)
203 }
204
205 fn serialize_i16(self, value: i16) -> Result<Self::Ok, Self::Error> {
206 self.serialize_i64(value as i64)
207 }
208
209 fn serialize_i32(self, value: i32) -> Result<Self::Ok, Self::Error> {
210 self.serialize_i64(value as i64)
211 }
212
213 fn serialize_i64(self, value: i64) -> Result<Self::Ok, Self::Error> {
214 Ok(Value::Integer(value))
215 }
216
217 fn serialize_u8(self, value: u8) -> Result<Self::Ok, Self::Error> {
218 self.serialize_u64(value as u64)
219 }
220
221 fn serialize_u16(self, value: u16) -> Result<Self::Ok, Self::Error> {
222 self.serialize_u64(value as u64)
223 }
224
225 fn serialize_u32(self, value: u32) -> Result<Self::Ok, Self::Error> {
226 self.serialize_u64(value as u64)
227 }
228
229 fn serialize_u64(self, value: u64) -> Result<Self::Ok, Self::Error> {
230 if value <= i64::max_value() as u64 {
231 self.serialize_i64(value as i64)
232 } else {
233 Err(SerializeError::custom("Integer out of bounds"))
234 }
235 }
236
237 fn serialize_f32(self, value: f32) -> Result<Self::Ok, Self::Error> {
238 self.serialize_f64(value as f64)
239 }
240
241 fn serialize_f64(self, value: f64) -> Result<Self::Ok, Self::Error> {
242 Ok(Value::Number(value))
243 }
244
245 fn serialize_char(self, value: char) -> Result<Self::Ok, Self::Error> {
246 Ok(Value::Text(value.to_string()))
247 }
248
249 fn serialize_str(self, value: &str) -> Result<Self::Ok, Self::Error> {
250 Ok(Value::Text(value.to_string()))
251 }
252
253 fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> {
254 let mut seq = self.serialize_seq(Some(value.len()))?;
255 for x in value {
256 seq.serialize_element(x)?;
257 }
258 seq.end()
259 }
260
261 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
262 self.serialize_unit()
263 }
264
265 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error>
266 where
267 T: ser::Serialize + ?Sized,
268 {
269 value.serialize(self)
270 }
271
272 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
273 Ok(Value::Null)
274 }
275
276 fn serialize_unit_struct(self, _name: &'static str)
277 -> Result<Self::Ok, Self::Error>
278 {
279 self.serialize_unit()
280 }
281
282 fn serialize_unit_variant(
283 self,
284 _name: &'static str,
285 _index: u32,
286 variant: &'static str
287 )
288 -> Result<Self::Ok, Self::Error>
289 {
290 self.serialize_str(variant)
291 }
292
293 fn serialize_newtype_struct<T>(
294 self,
295 _name: &'static str,
296 value: &T
297 )
298 -> Result<Self::Ok, Self::Error>
299 where
300 T: ser::Serialize + ?Sized,
301 {
302 value.serialize(self)
303 }
304
305 fn serialize_newtype_variant<T>(
306 self,
307 _name: &'static str,
308 _index: u32,
309 variant: &'static str,
310 value: &T,
311 )
312 -> Result<Self::Ok, Self::Error>
313 where
314 T: ser::Serialize + ?Sized,
315 {
316 let mut table = Table::new();
317 table.set(variant, value.serialize(self)?);
318 Ok(Value::Table(table))
319 }
320
321 fn serialize_seq(self, len: Option<usize>)
322 -> Result<Self::SerializeSeq, Self::Error>
323 {
324 let buf = match len {
325 Some(x) => Vec::with_capacity(x),
326 None => Vec::new(),
327 };
328
329 Ok(ListSerializer {
330 buf,
331 })
332 }
333
334 fn serialize_tuple(self, len: usize)
335 -> Result<Self::SerializeTuple, Self::Error>
336 {
337 self.serialize_seq(Some(len))
338 }
339
340 fn serialize_tuple_struct(self, _name: &'static str, len: usize)
341 -> Result<Self::SerializeTupleStruct, Self::Error>
342 {
343 self.serialize_seq(Some(len))
344 }
345
346 fn serialize_map(self, len: Option<usize>)
347 -> Result<Self::SerializeMap, Self::Error>
348 {
349 let buf = match len {
350 Some(x) => HashMap::with_capacity(x),
351 None => HashMap::new(),
352 };
353
354 Ok(TableSerializer {
355 buf,
356 key: None,
357 })
358 }
359
360 fn serialize_struct(self, _name: &'static str, len: usize)
361 -> Result<Self::SerializeStruct, Self::Error>
362 {
363 self.serialize_map(Some(len))
364 }
365
366 fn serialize_tuple_variant(
367 self,
368 _name: &'static str,
369 _index: u32,
370 variant: &'static str,
371 len: usize
372 )
373 -> Result<Self::SerializeTupleVariant, Self::Error>
374 {
375 Ok(ListVariantSerializer {
376 variant,
377 buf: Vec::with_capacity(len),
378 })
379 }
380
381 fn serialize_struct_variant(
382 self,
383 _name: &'static str,
384 _index: u32,
385 variant: &'static str,
386 len: usize,
387 )
388 -> Result<Self::SerializeStructVariant, Self::Error>
389 {
390 Ok(TableVariantSerializer {
391 variant,
392 buf: HashMap::with_capacity(len),
393 })
394 }
395}
396
397impl ser::SerializeSeq for ListSerializer {
398 type Ok = Value;
399 type Error = SerializeError;
400
401 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
402 where
403 T: ser::Serialize + ?Sized,
404 {
405 self.buf.push(value.serialize(ValueSerializer)?);
406 Ok(())
407 }
408
409 fn end(self) -> Result<Self::Ok, Self::Error> {
410 Ok(Value::List(self.buf))
411 }
412}
413
414impl ser::SerializeTuple for ListSerializer {
415 type Ok = Value;
416 type Error = SerializeError;
417
418 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Self::Error>
419 where
420 T: ser::Serialize + ?Sized,
421 {
422 self.buf.push(value.serialize(ValueSerializer)?);
423 Ok(())
424 }
425
426 fn end(self) -> Result<Self::Ok, Self::Error> {
427 Ok(Value::List(self.buf))
428 }
429}
430
431impl ser::SerializeTupleStruct for ListSerializer {
432 type Ok = Value;
433 type Error = SerializeError;
434
435 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
436 where
437 T: ser::Serialize + ?Sized,
438 {
439 self.buf.push(value.serialize(ValueSerializer)?);
440 Ok(())
441 }
442
443 fn end(self) -> Result<Self::Ok, Self::Error> {
444 Ok(Value::List(self.buf))
445 }
446}
447
448impl ser::SerializeMap for TableSerializer {
449 type Ok = Value;
450 type Error = SerializeError;
451
452 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Self::Error>
453 where
454 T: ser::Serialize + ?Sized,
455 {
456 if let Value::Text(key) = key.serialize(ValueSerializer)? {
457 self.key = Some(key);
458 Ok(())
459 } else {
460 Err(SerializeError::custom("Table keys must be a string type."))
461 }
462 }
463
464 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Self::Error>
465 where
466 T: ser::Serialize + ?Sized,
467 {
468 let key = self.key.take().unwrap();
469 self.buf.insert(key, value.serialize(ValueSerializer)?);
470 Ok(())
471 }
472
473 fn serialize_entry<K, V>(&mut self, key: &K, value: &V)
474 -> Result<(), Self::Error>
475 where
476 K: ser::Serialize + ?Sized,
477 V: ser::Serialize + ?Sized,
478 {
479 if let Value::Text(key) = key.serialize(ValueSerializer)? {
480 self.buf.insert(key, value.serialize(ValueSerializer)?);
481 Ok(())
482 } else {
483 Err(SerializeError::custom("Table keys must be a string type."))
484 }
485 }
486
487 fn end(self) -> Result<Self::Ok, Self::Error> {
488 Ok(Value::Table(Table::from(self.buf)))
489 }
490}
491
492impl ser::SerializeStruct for TableSerializer {
493 type Ok = Value;
494 type Error = SerializeError;
495
496 fn serialize_field<T>(&mut self, key: &'static str, value: &T)
497 -> Result<(), Self::Error>
498 where
499 T: ser::Serialize + ?Sized,
500 {
501 self.buf.insert(key.to_string(), value.serialize(ValueSerializer)?);
502 Ok(())
503 }
504
505 fn end(self) -> Result<Self::Ok, Self::Error> {
506 Ok(Value::Table(Table::from(self.buf)))
507 }
508}
509
510impl ser::SerializeTupleVariant for ListVariantSerializer {
511 type Ok = Value;
512 type Error = SerializeError;
513
514 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Self::Error>
515 where
516 T: ser::Serialize + ?Sized,
517 {
518 self.buf.push(value.serialize(ValueSerializer)?);
519 Ok(())
520 }
521
522 fn end(self) -> Result<Self::Ok, Self::Error> {
523 let mut table = Table::new();
524 table.set(self.variant, self.buf);
525 Ok(Value::Table(table))
526 }
527}
528
529impl ser::SerializeStructVariant for TableVariantSerializer {
530 type Ok = Value;
531 type Error = SerializeError;
532
533 fn serialize_field<T>(&mut self, key: &'static str, value: &T)
534 -> Result<(), Self::Error>
535 where
536 T: ser::Serialize + ?Sized,
537 {
538 self.buf.insert(key.to_string(), value.serialize(ValueSerializer)?);
539 Ok(())
540 }
541
542 fn end(self) -> Result<Self::Ok, Self::Error> {
543 let mut table = Table::new();
544 table.set(self.variant, Table::from(self.buf));
545 Ok(Value::Table(table))
546 }
547}
548
549#[derive(Debug)]
550pub struct DeserializeError {
551 description: String,
552}
553
554impl ::std::error::Error for DeserializeError {}
555
556impl de::Error for DeserializeError {
557 fn custom<T>(msg: T) -> Self
558 where
559 T: fmt::Display,
560 {
561 DeserializeError {
562 description: msg.to_string(),
563 }
564 }
565}
566
567impl fmt::Display for DeserializeError {
568 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
569 f.write_str(&self.description)
570 }
571}
572
573impl<'de> de::Deserializer<'de> for &'de Value {
574 type Error = DeserializeError;
575
576 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
577 where
578 V: de::Visitor<'de>,
579 {
580 match self {
581 Value::Null => visitor.visit_none(),
582 Value::Boolean(x) => visitor.visit_bool(*x),
583 Value::Integer(x) => visitor.visit_i64(*x),
584 Value::Number(x) => visitor.visit_f64(*x),
585 Value::Text(ref x) => visitor.visit_borrowed_str(x),
586 Value::List(ref x) => {
587 let seq = de::value::SeqDeserializer::new(x.iter());
588 visitor.visit_seq(seq)
589 },
590 Value::Table(ref x) => {
591 let map = de::value::MapDeserializer::new(
592 x.iter().map(|(k, v)| (k.as_str(), v))
593 );
594 visitor.visit_map(map)
595 },
596 }
597 }
598
599 forward_to_deserialize_any! {
600 bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes
601 byte_buf option unit unit_struct newtype_struct seq tuple tuple_struct
602 map struct enum identifier ignored_any
603 }
604}
605
606impl<'de> de::IntoDeserializer<'de, DeserializeError> for &'de Value {
607 type Deserializer = &'de Value;
608
609 fn into_deserializer(self) -> Self::Deserializer {
610 self
611 }
612}