1use serde::Serialize;
2
3use crate::value::Value;
4
5impl Serialize for Value {
6 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
7 where
8 S: serde::ser::Serializer,
9 {
10 use serde::ser::*;
11
12 match self {
13 Self::Undefined => serializer.serialize_unit(),
14 Self::Null => serializer.serialize_none(),
15 Self::Bool(value) => serializer.serialize_bool(*value),
16 Self::Num(value) => {
17 if Value::number_is_safe_integer(*value) {
18 serializer.serialize_i64(*value as i64)
19 } else {
20 serializer.serialize_f64(*value)
21 }
22 }
23 Self::Int(value) => serializer.serialize_str(value.to_string().as_str()),
24 Self::Str(value) => serializer.serialize_str(value),
25 Self::Array(value) => value.serialize(serializer),
26 Self::Object(value) => {
27 let mut map = serializer.serialize_map(Some(value.len()))?;
28 for (k, v) in value.iter() {
29 map.serialize_entry(k, v)?;
30 }
31 map.end()
32 }
33 Self::Coro(_) => Err(serde::ser::Error::custom("Cannot serialize coroutine")),
34 }
35 }
36}