vtcode_commons/
serde_helpers.rs1use serde::{Deserialize, Deserializer};
4use std::fmt::Display;
5use std::str::FromStr;
6
7pub fn json_to_string_pretty(value: &serde_json::Value) -> String {
14 serde_json::to_string_pretty(value).unwrap_or_else(|_| value.to_string())
15}
16
17pub fn deserialize_maybe_quoted<'de, T, D>(deserializer: D) -> Result<T, D::Error>
20where
21 T: FromStr + Deserialize<'de>,
22 T::Err: Display,
23 D: Deserializer<'de>,
24{
25 #[derive(Deserialize)]
26 #[serde(untagged)]
27 enum MaybeQuoted<T> {
28 Native(T),
29 Quoted(String),
30 }
31
32 match MaybeQuoted::<T>::deserialize(deserializer)? {
33 MaybeQuoted::Native(val) => Ok(val),
34 MaybeQuoted::Quoted(s) => T::from_str(&s).map_err(serde::de::Error::custom),
35 }
36}
37
38pub fn deserialize_opt_maybe_quoted<'de, T, D>(deserializer: D) -> Result<Option<T>, D::Error>
40where
41 T: FromStr + Deserialize<'de>,
42 T::Err: Display,
43 D: Deserializer<'de>,
44{
45 #[derive(Deserialize)]
46 #[serde(untagged)]
47 enum MaybeQuoted<T> {
48 Native(T),
49 Quoted(String),
50 Null,
51 }
52
53 match MaybeQuoted::<T>::deserialize(deserializer)? {
54 MaybeQuoted::Native(val) => Ok(Some(val)),
55 MaybeQuoted::Quoted(s) => T::from_str(&s).map(Some).map_err(serde::de::Error::custom),
56 MaybeQuoted::Null => Ok(None),
57 }
58}