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 16 17 18 19 20 21 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 52 53 54 55 56 57 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 129 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 157 }158 todo!()159 }160 Val::Obj(_) => todo!(),161 Val::Func(_) => Err(S::Error::custom("tried to manifest function")),162 }163 }164}