valu3/serde_value/
ser.rs

1use crate::prelude::*;
2use crate::types::number::NumberType;
3use serde::ser::SerializeSeq;
4use serde::ser::{Error, Serialize, Serializer};
5
6
7impl Serialize for Value {
8    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
9    where
10        S: Serializer,
11    {
12        match self {
13            Value::Object(value) => {
14                use serde::ser::SerializeMap;
15                let mut map = serializer.serialize_map(Some(value.len()))?;
16                for (k, v) in value.iter() {
17                    map.serialize_entry(&k.to_string(), &v)?;
18                }
19                map.end()
20            }
21            Value::Array(value) => {
22                let mut seq = serializer.serialize_seq(Some(value.len()))?;
23                for elem in value {
24                    seq.serialize_element(elem)?;
25                }
26                seq.end()
27            }
28            Value::String(value) => serializer.serialize_str(value.as_str()),
29            Value::Number(value) => match &value.number_type() {
30                NumberType::U8 => serializer.serialize_u8(value.get_u8_unsafe()),
31                NumberType::U16 => serializer.serialize_u16(value.get_u16_unsafe()),
32                NumberType::U32 => serializer.serialize_u32(value.get_u32_unsafe()),
33                NumberType::U64 => serializer.serialize_u64(value.get_u64_unsafe()),
34                NumberType::U128 => serializer.serialize_u128(value.get_u128_unsafe()),
35                NumberType::I8 => serializer.serialize_i8(value.get_i8_unsafe()),
36                NumberType::I16 => serializer.serialize_i16(value.get_i16_unsafe()),
37                NumberType::I32 => serializer.serialize_i32(value.get_i32_unsafe()),
38                NumberType::I64 => serializer.serialize_i64(value.get_i64_unsafe()),
39                NumberType::I128 => serializer.serialize_i128(value.get_i128_unsafe()),
40                NumberType::F32 => serializer.serialize_f32(value.get_f32_unsafe()),
41                NumberType::F64 => serializer.serialize_f64(value.get_f64_unsafe()),
42                NumberType::Unknown => Err(Error::custom("Unknown number type")),
43            },
44            Value::Boolean(value) => serializer.serialize_bool(*value),
45            Value::Null => serializer.serialize_none(),
46            Value::Undefined => serializer.serialize_none(),
47            Value::DateTime(value) => serializer.serialize_str(&value.to_iso8601()),
48        }
49    }
50}