git.delta.rocks / jrsonnet / refs/commits / 284612bfbf1c

difftreelog

source

crates/jrsonnet-evaluator/src/integrations/serde.rs3.8 KiBsourcehistory
1use std::borrow::Cow;23use jrsonnet_gcmodule::Cc;4use serde::{de::Visitor, ser::Error, Deserialize, Serialize};56use crate::{error::Result, val::ArrValue, ObjValueBuilder, State, Val};78impl<'de> Deserialize<'de> for Val {9	fn deserialize<D>(deserializer: D) -> Result<Val, D::Error>10	where11		D: serde::Deserializer<'de>,12	{13		struct ValVisitor;1415		// macro_rules! visit_num {16		// 	($($method:ident => $ty:ty),* $(,)?) => {$(17		// 		fn $method<E>(self, v: $ty) -> Result<Self::Value, E>18		// 		where19		// 			E: serde::de::Error,20		// 		{21		// 			Ok(Val::Num(f64::from(v)))22		// 		}23		// 	)*};24		// }2526		impl<'de> Visitor<'de> for ValVisitor {27			type Value = Val;2829			fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>30			where31				E: serde::de::Error,32			{33				Ok(Val::Bool(v))34			}35			fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>36			where37				E: serde::de::Error,38			{39				if !v.is_finite() {40					return Err(E::custom("only finite numbers are supported"));41				}42				Ok(Val::Num(v))43			}44			fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>45			where46				E: serde::de::Error,47			{48				Ok(Val::Str(v.into()))49			}5051			// visit_num! {52			// 	visit_i8 => i8,53			// 	visit_i16 => i16,54			// 	visit_i32 => i32,55			// 	visit_u8 => u8,56			// 	visit_u16 => u16,57			// 	visit_u32 => u32,58			// }59			fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>60			where61				E: serde::de::Error,62			{63				Ok(Val::Num(v as f64))64			}65			fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>66			where67				E: serde::de::Error,68			{69				Ok(Val::Num(v as f64))70			}7172			fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>73			where74				E: serde::de::Error,75			{76				Ok(Val::Arr(ArrValue::Bytes(v.into())))77			}7879			fn visit_none<E>(self) -> Result<Self::Value, E>80			where81				E: serde::de::Error,82			{83				Ok(Val::Null)84			}85			fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>86			where87				D: serde::Deserializer<'de>,88			{89				deserializer.deserialize_any(self)90			}9192			fn visit_unit<E>(self) -> Result<Self::Value, E>93			where94				E: serde::de::Error,95			{96				Ok(Val::Null)97			}9899			fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>100			where101				D: serde::Deserializer<'de>,102			{103				deserializer.deserialize_any(self)104			}105106			fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>107			where108				A: serde::de::SeqAccess<'de>,109			{110				let mut out = seq.size_hint().map_or_else(Vec::new, Vec::with_capacity);111112				while let Some(val) = seq.next_element::<Val>()? {113					out.push(val);114				}115116				Ok(Val::Arr(ArrValue::Eager(Cc::new(out))))117			}118119			fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>120			where121				A: serde::de::MapAccess<'de>,122			{123				let mut out = map124					.size_hint()125					.map_or_else(ObjValueBuilder::new, ObjValueBuilder::with_capacity);126127				while let Some((k, v)) = map.next_entry::<Cow<'de, str>, Val>()? {128					// Jsonnet ignores duplicate keys129					out.member(k.into()).value_unchecked(v);130				}131132				Ok(Val::Obj(out.build()))133			}134135			fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {136				write!(formatter, "any valid jsonnet value")137			}138		}139		deserializer.deserialize_any(ValVisitor)140	}141}142143impl Serialize for Val {144	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>145	where146		S: serde::Serializer,147	{148		match self {149			Val::Bool(v) => serializer.serialize_bool(*v),150			Val::Null => serializer.serialize_none(),151			Val::Str(s) => serializer.serialize_str(s),152			Val::Num(n) => serializer.serialize_f64(*n),153			Val::Arr(arr) => {154				let mut seq = serializer.serialize_seq(Some(arr.len()))?;155				for element in arr.iter(State::default()) {156					// seq.serialize_element()157				}158				todo!()159			}160			Val::Obj(_) => todo!(),161			Val::Func(_) => Err(S::Error::custom("tried to manifest function")),162		}163	}164}