Ruby 最近学 rust,vibe 了一个序列化器,想念宏魔法

zzz6519003 · 2026年03月19日 · 17 次阅读

整出这样的代码

use crate::ast::Json;
use crate::parser::parse;
use std::collections::HashMap;

pub trait ToJson { fn to_json_value(&self) -> Json; }
pub trait FromJson: Sized { fn from_json_value(v: Json) -> Result<Self, String>; }

pub trait Serialize { fn serialize(&self) -> String; }
pub trait Deserialize: Sized { fn deserialize(s: &str) -> Result<Self, String>; }

impl<T: ToJson> Serialize for T { fn serialize(&self) -> String { self.to_json_value().to_string() } }
impl<T: FromJson> Deserialize for T { fn deserialize(s: &str) -> Result<Self, String> { let j = parse(s)?; FromJson::from_json_value(j) } }

// Primitive impls
impl ToJson for String { fn to_json_value(&self) -> Json { Json::String(self.clone()) } }
impl ToJson for &str { fn to_json_value(&self) -> Json { Json::String(self.to_string()) } }
impl ToJson for bool { fn to_json_value(&self) -> Json { Json::Bool(*self) } }
impl ToJson for f64 { fn to_json_value(&self) -> Json { Json::Number(*self) } }
impl ToJson for i64 { fn to_json_value(&self) -> Json { Json::Number(*self as f64) } }
impl ToJson for u64 { fn to_json_value(&self) -> Json { Json::Number(*self as f64) } }

impl FromJson for String { fn from_json_value(v: Json) -> Result<Self, String> { if let Json::String(s) = v { Ok(s) } else { Err("expected string".into()) } } }
impl FromJson for bool { fn from_json_value(v: Json) -> Result<Self, String> { if let Json::Bool(b) = v { Ok(b) } else { Err("expected bool".into()) } } }
impl FromJson for f64 { fn from_json_value(v: Json) -> Result<Self, String> { if let Json::Number(n) = v { Ok(n) } else { Err("expected number".into()) } } }
impl FromJson for i64 { fn from_json_value(v: Json) -> Result<Self, String> { if let Json::Number(n) = v { Ok(n as i64) } else { Err("expected number".into()) } } }
impl FromJson for u64 { fn from_json_value(v: Json) -> Result<Self, String> { if let Json::Number(n) = v { Ok(n as u64) } else { Err("expected number".into()) } } }

// Option
impl<T: ToJson> ToJson for Option<T> { fn to_json_value(&self) -> Json { match self { Some(v) => v.to_json_value(), None => Json::Null } } }
impl<T: FromJson> FromJson for Option<T> { fn from_json_value(v: Json) -> Result<Self, String> { match v { Json::Null => Ok(None), other => Ok(Some(FromJson::from_json_value(other)?)) } } }

// Vec
impl<T: ToJson> ToJson for Vec<T> { fn to_json_value(&self) -> Json { Json::Array(self.iter().map(|v| v.to_json_value()).collect()) } }
impl<T: FromJson> FromJson for Vec<T> { fn from_json_value(v: Json) -> Result<Self, String> { if let Json::Array(arr) = v { arr.into_iter().map(|el| FromJson::from_json_value(el)).collect() } else { Err("expected array".into()) } } }

// HashMap<String, T>
impl<T: ToJson> ToJson for HashMap<String, T> { fn to_json_value(&self) -> Json { let mut m = HashMap::new(); for (k, v) in self.iter() { m.insert(k.clone(), v.to_json_value()); } Json::Object(m) } }
impl<T: FromJson> FromJson for HashMap<String, T> { fn from_json_value(v: Json) -> Result<Self, String> { if let Json::Object(map) = v { let mut out = HashMap::new(); for (k, v) in map { out.insert(k, FromJson::from_json_value(v)?); } Ok(out) } else { Err("expected object".into()) } } }

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号