Skip to main content

revive_common/
utils.rs

1//! The compiler common utils.
2
3/// Deserializes a `serde_json` object from slice with the recursion limit disabled.
4///
5/// Must be used for all JSON I/O to avoid crashes due to the aforementioned limit.
6pub fn deserialize_from_slice<O>(input: &[u8]) -> anyhow::Result<O>
7where
8    O: serde::de::DeserializeOwned,
9{
10    let deserializer = serde_json::Deserializer::from_slice(input);
11    deserialize(deserializer)
12}
13
14/// Deserializes a `serde_json` object from string with the recursion limit disabled.
15///
16/// Must be used for all JSON I/O to avoid crashes due to the aforementioned limit.
17pub fn deserialize_from_str<O>(input: &str) -> anyhow::Result<O>
18where
19    O: serde::de::DeserializeOwned,
20{
21    let deserializer = serde_json::Deserializer::from_str(input);
22    deserialize(deserializer)
23}
24
25/// Deserializes a `serde_json` object from reader with the recursion limit disabled.
26///
27/// Must be used for all JSON I/O to avoid crashes due to the aforementioned limit.
28pub fn deserialize_from_reader<R, O>(reader: R) -> anyhow::Result<O>
29where
30    R: std::io::Read,
31    O: serde::de::DeserializeOwned,
32{
33    let deserializer = serde_json::Deserializer::from_reader(reader);
34    deserialize(deserializer)
35}
36
37/// Runs the generic deserializer.
38pub fn deserialize<'de, R, O>(mut deserializer: serde_json::Deserializer<R>) -> anyhow::Result<O>
39where
40    R: serde_json::de::Read<'de>,
41    O: serde::de::DeserializeOwned,
42{
43    deserializer.disable_recursion_limit();
44    let deserializer = serde_stacker::Deserializer::new(&mut deserializer);
45    let result = O::deserialize(deserializer)?;
46    Ok(result)
47}