osom_lib_test_helpers/
deserialize.rs1use serde::{Deserialize, Serialize, de::DeserializeSeed};
2
3pub fn deserialize_json<'de, T>(text: &'de str) -> Result<T, serde_json::Error>
9where
10 T: Deserialize<'de>,
11{
12 let mut deserializer = serde_json::Deserializer::from_str(text);
13 let result = T::deserialize(&mut deserializer)?;
14 deserializer.end()?;
15 Ok(result)
16}
17
18pub fn deserialize_json_with_seed<'de, T, TSeed>(text: &'de str, seed: TSeed) -> Result<T, serde_json::Error>
24where
25 TSeed: DeserializeSeed<'de, Value = T>,
26{
27 let mut deserializer = serde_json::Deserializer::from_str(text);
28 let result = seed.deserialize(&mut deserializer)?;
29 deserializer.end()?;
30 Ok(result)
31}
32
33struct StringIOAdapter(String);
34
35impl std::io::Write for StringIOAdapter {
36 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
37 let s = std::str::from_utf8(buf)
38 .map_err(|_| std::io::Error::new(std::io::ErrorKind::InvalidData, "byte buffer is not valid UTF-8"))?;
39 self.0.push_str(s);
40 Ok(s.len())
41 }
42
43 fn flush(&mut self) -> std::io::Result<()> {
44 Ok(())
45 }
46}
47
48pub fn serialize_json<T>(value: &T) -> Result<String, serde_json::Error>
54where
55 T: Serialize,
56{
57 let mut serializer = serde_json::Serializer::new(StringIOAdapter(String::new()));
58 value.serialize(&mut serializer)?;
59 Ok(serializer.into_inner().0)
60}