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 20 21 22 23 24 25 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 56 57 58 59 60 61 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 133 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 162 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 187 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}