tiscript/
ser.rs

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}