toml_span/
impl_serde.rs

1#![cfg_attr(docsrs, doc(cfg(feature = "serde")))]
2
3//! Provides [`serde::Serialize`] support for [`Value`] and [`Spanned`]
4
5use 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}