use serde::Serialize;
use serde::de::DeserializeOwned;
pub trait JsonUtil: Sized + Serialize + DeserializeOwned {
fn try_to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string(self)
}
fn try_to_pretty_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(self)
}
fn from_json<S>(json: S) -> Result<Self, serde_json::Error>
where
S: AsRef<str>,
{
serde_json::from_str(json.as_ref())
}
}
impl<T> JsonUtil for T where T: Sized + Serialize + DeserializeOwned {}
#[cfg(test)]
mod tests {
use serde::{Deserialize, Serialize};
use super::*;
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize)]
struct Sample {
a: u32,
b: String,
}
#[test]
fn round_trip() {
let value = Sample {
a: 1,
b: "hi".to_owned(),
};
let json = value.try_to_json().unwrap();
assert_eq!(json, r#"{"a":1,"b":"hi"}"#);
let parsed = Sample::from_json(&json).unwrap();
assert_eq!(parsed, value);
}
#[test]
fn pretty() {
let value = Sample {
a: 1,
b: "hi".to_owned(),
};
let json = value.try_to_pretty_json().unwrap();
assert!(json.contains('\n'));
}
}