1#![cfg_attr(docsrs, doc(cfg(feature = "serde")))]
2
3use crate::{
6 value::{Value, ValueInner},
7 Spanned,
8};
9use serde::ser::{SerializeMap, SerializeSeq};
10
11impl serde::Serialize for Value<'_> {
12 fn serialize<S>(&self, ser: S) -> Result<S::Ok, S::Error>
13 where
14 S: serde::Serializer,
15 {
16 match self.as_ref() {
17 ValueInner::String(s) => ser.serialize_str(s),
18 ValueInner::Integer(i) => ser.serialize_i64(*i),
19 ValueInner::Float(f) => ser.serialize_f64(*f),
20 ValueInner::Boolean(b) => ser.serialize_bool(*b),
21 ValueInner::Array(arr) => {
22 let mut seq = ser.serialize_seq(Some(arr.len()))?;
23 for ele in arr {
24 seq.serialize_element(ele)?;
25 }
26 seq.end()
27 }
28 ValueInner::Table(tab) => {
29 let mut map = ser.serialize_map(Some(tab.len()))?;
30 for (k, v) in tab {
31 map.serialize_entry(&k.name, v)?;
32 }
33 map.end()
34 }
35 }
36 }
37}
38
39impl<T> serde::Serialize for Spanned<T>
40where
41 T: serde::Serialize,
42{
43 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
44 where
45 S: serde::Serializer,
46 {
47 self.value.serialize(serializer)
48 }
49}