git.delta.rocks / jrsonnet / refs/commits / 2cecfb0ba471

difftreelog

source

crates/jrsonnet-evaluator/src/integrations/serde.rs4.8 KiBsourcehistory
1use std::borrow::Cow;23use serde::{4	de::Visitor,5	ser::{Error, SerializeMap, SerializeSeq},6	Deserialize, Serialize,7};89use crate::{arr::ArrValue, error::Result, val::StrValue, ObjValueBuilder, State, Val};1011impl<'de> Deserialize<'de> for Val {12	fn deserialize<D>(deserializer: D) -> Result<Val, D::Error>13	where14		D: serde::Deserializer<'de>,15	{16		struct ValVisitor;1718		// macro_rules! visit_num {19		// 	($($method:ident => $ty:ty),* $(,)?) => {$(20		// 		fn $method<E>(self, v: $ty) -> Result<Self::Value, E>21		// 		where22		// 			E: serde::de::Error,23		// 		{24		// 			Ok(Val::Num(f64::from(v)))25		// 		}26		// 	)*};27		// }2829		impl<'de> Visitor<'de> for ValVisitor {30			type Value = Val;3132			fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>33			where34				E: serde::de::Error,35			{36				Ok(Val::Bool(v))37			}38			fn visit_f64<E>(self, v: f64) -> Result<Self::Value, E>39			where40				E: serde::de::Error,41			{42				if !v.is_finite() {43					return Err(E::custom("only finite numbers are supported"));44				}45				Ok(Val::Num(v))46			}47			fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>48			where49				E: serde::de::Error,50			{51				Ok(Val::Str(StrValue::Flat(v.into())))52			}5354			// visit_num! {55			// 	visit_i8 => i8,56			// 	visit_i16 => i16,57			// 	visit_i32 => i32,58			// 	visit_u8 => u8,59			// 	visit_u16 => u16,60			// 	visit_u32 => u32,61			// }62			fn visit_i64<E>(self, v: i64) -> Result<Self::Value, E>63			where64				E: serde::de::Error,65			{66				Ok(Val::Num(v as f64))67			}68			fn visit_u64<E>(self, v: u64) -> Result<Self::Value, E>69			where70				E: serde::de::Error,71			{72				Ok(Val::Num(v as f64))73			}7475			fn visit_bytes<E>(self, v: &[u8]) -> Result<Self::Value, E>76			where77				E: serde::de::Error,78			{79				Ok(Val::Arr(ArrValue::bytes(v.into())))80			}8182			fn visit_none<E>(self) -> Result<Self::Value, E>83			where84				E: serde::de::Error,85			{86				Ok(Val::Null)87			}88			fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>89			where90				D: serde::Deserializer<'de>,91			{92				deserializer.deserialize_any(self)93			}9495			fn visit_unit<E>(self) -> Result<Self::Value, E>96			where97				E: serde::de::Error,98			{99				Ok(Val::Null)100			}101102			fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>103			where104				D: serde::Deserializer<'de>,105			{106				deserializer.deserialize_any(self)107			}108109			fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>110			where111				A: serde::de::SeqAccess<'de>,112			{113				let mut out = seq.size_hint().map_or_else(Vec::new, Vec::with_capacity);114115				while let Some(val) = seq.next_element::<Val>()? {116					out.push(val);117				}118119				Ok(Val::Arr(ArrValue::eager(out)))120			}121122			fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>123			where124				A: serde::de::MapAccess<'de>,125			{126				let mut out = map127					.size_hint()128					.map_or_else(ObjValueBuilder::new, ObjValueBuilder::with_capacity);129130				while let Some((k, v)) = map.next_entry::<Cow<'de, str>, Val>()? {131					// Jsonnet ignores duplicate keys132					out.member(k.into()).value_unchecked(v);133				}134135				Ok(Val::Obj(out.build()))136			}137138			fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {139				write!(formatter, "any valid jsonnet value")140			}141		}142		deserializer.deserialize_any(ValVisitor)143	}144}145146impl Serialize for Val {147	fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>148	where149		S: serde::Serializer,150	{151		match self {152			Val::Bool(v) => serializer.serialize_bool(*v),153			Val::Null => serializer.serialize_none(),154			Val::Str(s) => serializer.serialize_str(&s.clone().into_flat()),155			Val::Num(n) => serializer.serialize_f64(*n),156			Val::Arr(arr) => {157				let mut seq = serializer.serialize_seq(Some(arr.len()))?;158				for (i, element) in arr.iter().enumerate() {159					let mut serde_error = None;160					// TODO: rewrite using try{} after stabilization161					State::push_description(162						|| format!("array index [{i}]"),163						|| {164							let e = element?;165							if let Err(e) = seq.serialize_element(&e) {166								serde_error = Some(e);167							}168							Ok(())169						},170					)171					.map_err(|e| S::Error::custom(e.to_string()))?;172					if let Some(e) = serde_error {173						return Err(e);174					}175				}176				seq.end()177			}178			Val::Obj(obj) => {179				let mut map = serializer.serialize_map(Some(obj.len()))?;180				for (field, value) in obj.iter(181					#[cfg(feature = "exp-preserve-order")]182					true,183				) {184					let mut serde_error = None;185					// TODO: rewrite using try{} after stabilization186					State::push_description(187						|| format!("object field {field:?}"),188						|| {189							let v = value?;190							if let Err(e) = map.serialize_entry(field.as_str(), &v) {191								serde_error = Some(e);192							}193							Ok(())194						},195					)196					.map_err(|e| S::Error::custom(e.to_string()))?;197					if let Some(e) = serde_error {198						return Err(e);199					}200				}201				map.end()202			}203			Val::Func(_) => Err(S::Error::custom("tried to manifest function")),204		}205	}206}