Skip to main content

osom_lib_test_helpers/
deserialize.rs

1use serde::{Deserialize, Serialize, de::DeserializeSeed};
2
3/// Deserializes a JSON string into a value.
4///
5/// # Errors
6///
7/// Returns an error when deserialization fails.
8pub 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
18/// Deserializes a JSON string into a value using a seed.
19///
20/// # Errors
21///
22/// Returns an error when deserialization fails.
23pub 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
48/// Serializes a value into a JSON string.
49///
50/// # Errors
51///
52/// Returns an error when serialization fails.
53pub 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}