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 19 20 21 22 23 24 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 55 56 57 58 59 60 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 132 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 161 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 186 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}