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}