tiscript 0.0.3

Turing-Incomplete TypeScript as a Configuration Language
Documentation
use serde::Serialize;

use crate::value::Value;

impl Serialize for Value {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: serde::ser::Serializer,
    {
        use serde::ser::*;

        match self {
            Self::Undefined => serializer.serialize_unit(),
            Self::Null => serializer.serialize_none(),
            Self::Bool(value) => serializer.serialize_bool(*value),
            Self::Num(value) => {
                if Value::number_is_safe_integer(*value) {
                    serializer.serialize_i64(*value as i64)
                } else {
                    serializer.serialize_f64(*value)
                }
            }
            Self::Int(value) => serializer.serialize_str(value.to_string().as_str()),
            Self::Str(value) => serializer.serialize_str(value),
            Self::Array(value) => value.serialize(serializer),
            Self::Object(value) => {
                let mut map = serializer.serialize_map(Some(value.len()))?;
                for (k, v) in value.iter() {
                    map.serialize_entry(k, v)?;
                }
                map.end()
            }
            Self::Coro(_) => Err(serde::ser::Error::custom("Cannot serialize coroutine")),
        }
    }
}