git.delta.rocks / jrsonnet / refs/commits / 1925b3a76ba9

difftreelog

source

crates/jrsonnet-evaluator/src/integrations/serde.rs4.8 KiBsourcehistory
1use std::borrow::Cow;23use jrsonnet_gcmodule::Cc;4use serde::{5	de::Visitor,6	ser::{Error, SerializeMap, SerializeSeq},7	Deserialize, Serialize,8};910use crate::{error::Result, val::ArrValue, ObjValueBuilder, State, Val};1112impl<'de> Deserialize<'de> for Val {13	fn deserialize<D>(deserializer: D) -> Result<Val, D::Error>14	where15		D: serde::Deserializer<'de>,16	{17		struct ValVisitor;1819		// macro_rules! visit_num {20		// 	($($method:ident => $ty:ty),* $(,)?) => {$(21		// 		fn $method<E>(self, v: $ty) -> Result<Self::Value, E>22		// 		where23		// 			E: serde::de::Error,24		// 		{25		// 			Ok(Val::Num(f64::from(v)))26		// 		}27		// 	)*};28		// }2930		impl<'de> Visitor<'de> for ValVisitor {31			type Value = Val;3233			fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>34			where35				E: serde::de::Error,36			{37				Ok(Val::Bool(v))38			}39			fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>40			where41				E: serde::de::Error,42			{43				if !v.is_finite() {44					return Err(E::custom("only finite numbers are supported"));45				}46				Ok(Val::Num(v))47			}48			fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>49			where50				E: serde::de::Error,51			{52				Ok(Val::Str(v.into()))53			}5455			// visit_num! {56			// 	visit_i8 => i8,57			// 	visit_i16 => i16,58			// 	visit_i32 => i32,59			// 	visit_u8 => u8,60			// 	visit_u16 => u16,61			// 	visit_u32 => u32,62			// }63			fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>64			where65				E: serde::de::Error,66			{67				Ok(Val::Num(v as f64))68			}69			fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>70			where71				E: serde::de::Error,72			{73				Ok(Val::Num(v as f64))74			}7576			fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>77			where78				E: serde::de::Error,79			{80				Ok(Val::Arr(ArrValue::Bytes(v.into())))81			}8283			fn visit_none<E>(self) -> Result<Self::Value, E>84			where85				E: serde::de::Error,86			{87				Ok(Val::Null)88			}89			fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>90			where91				D: serde::Deserializer<'de>,92			{93				deserializer.deserialize_any(self)94			}9596			fn visit_unit<E>(self) -> Result<Self::Value, E>97			where98				E: serde::de::Error,99			{100				Ok(Val::Null)101			}102103			fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>104			where105				D: serde::Deserializer<'de>,106			{107				deserializer.deserialize_any(self)108			}109110			fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>111			where112				A: serde::de::SeqAccess<'de>,113			{114				let mut out = seq.size_hint().map_or_else(Vec::new, Vec::with_capacity);115116				while let Some(val) = seq.next_element::<Val>()? {117					out.push(val);118				}119120				Ok(Val::Arr(ArrValue::Eager(Cc::new(out))))121			}122123			fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>124			where125				A: serde::de::MapAccess<'de>,126			{127				let mut out = map128					.size_hint()129					.map_or_else(ObjValueBuilder::new, ObjValueBuilder::with_capacity);130131				while let Some((k, v)) = map.next_entry::<Cow<'de, str>, Val>()? {132					// Jsonnet ignores duplicate keys133					out.member(k.into()).value_unchecked(v);134				}135136				Ok(Val::Obj(out.build()))137			}138139			fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {140				write!(formatter, "any valid jsonnet value")141			}142		}143		deserializer.deserialize_any(ValVisitor)144	}145}146147impl Serialize for Val {148	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>149	where150		S: serde::Serializer,151	{152		match self {153			Val::Bool(v) => serializer.serialize_bool(*v),154			Val::Null => serializer.serialize_none(),155			Val::Str(s) => serializer.serialize_str(s),156			Val::Num(n) => serializer.serialize_f64(*n),157			Val::Arr(arr) => {158				let mut seq = serializer.serialize_seq(Some(arr.len()))?;159				for (i, element) in arr.iter().enumerate() {160					let mut serde_error = None;161					// TODO: rewrite using try{} after stabilization162					State::push_description(163						|| format!("array index [{i}]"),164						|| {165							let e = element?;166							if let Err(e) = seq.serialize_element(&e) {167								serde_error = Some(e);168							}169							Ok(())170						},171					)172					.map_err(|e| S::Error::custom(e.to_string()))?;173					if let Some(e) = serde_error {174						return Err(e);175					}176				}177				seq.end()178			}179			Val::Obj(obj) => {180				let mut map = serializer.serialize_map(Some(obj.len()))?;181				for (field, value) in obj.iter(182					#[cfg(feature = "exp-preserve-order")]183					true,184				) {185					let mut serde_error = None;186					// TODO: rewrite using try{} after stabilization187					State::push_description(188						|| format!("object field {field:?}"),189						|| {190							let v = value?;191							if let Err(e) = map.serialize_entry(field.as_str(), &v) {192								serde_error = Some(e);193							}194							Ok(())195						},196					)197					.map_err(|e| S::Error::custom(e.to_string()))?;198					if let Some(e) = serde_error {199						return Err(e);200					}201				}202				map.end()203			}204			Val::Func(_) => Err(S::Error::custom("tried to manifest function")),205		}206	}207}