Skip to main content

provekit_common/utils/
serde_jsonify.rs

1//! Serde workaround to encode types as JSON strings in non-human-readable
2//! formats.
3
4use serde::{de::Error as _, ser::Error as _, Deserialize, Deserializer, Serialize, Serializer};
5
6pub fn serialize<T, S>(obj: &T, serializer: S) -> Result<S::Ok, S::Error>
7where
8    T: Serialize,
9    S: Serializer,
10{
11    if serializer.is_human_readable() {
12        T::serialize(obj, serializer)
13    } else {
14        let json = serde_json::to_string(obj).map_err(S::Error::custom)?;
15        serializer.serialize_str(&json)
16    }
17}
18
19pub fn deserialize<'de, T, D>(deserializer: D) -> Result<T, D::Error>
20where
21    T: Deserialize<'de>,
22    D: Deserializer<'de>,
23{
24    if deserializer.is_human_readable() {
25        T::deserialize(deserializer)
26    } else {
27        let json: &str = <&str>::deserialize(deserializer)?;
28        serde_json::from_str(json).map_err(D::Error::custom)
29    }
30}