diff options
author | Jesse Luehrs <doy@tozt.net> | 2020-05-23 16:16:25 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2020-05-23 16:16:25 -0400 |
commit | 80acb66445a612798ddf74bd6df60b51fd674fa0 (patch) | |
tree | 9c6b5fe2cb6bf33c79523a2ab2dcd9d0124c3e32 /src/json.rs | |
parent | c9473e0b61bc9d8264a6ce939ed74c3d9b8f4db5 (diff) | |
download | rbw-80acb66445a612798ddf74bd6df60b51fd674fa0.tar.gz rbw-80acb66445a612798ddf74bd6df60b51fd674fa0.zip |
better error messages when parsing a server message
Diffstat (limited to 'src/json.rs')
-rw-r--r-- | src/json.rs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/json.rs b/src/json.rs new file mode 100644 index 0000000..2816a1f --- /dev/null +++ b/src/json.rs @@ -0,0 +1,38 @@ +use crate::prelude::*; + +pub trait DeserializeJsonWithPath { + fn json_with_path<T: serde::de::DeserializeOwned>(self) -> Result<T>; +} + +impl DeserializeJsonWithPath for String { + fn json_with_path<T: serde::de::DeserializeOwned>(self) -> Result<T> { + let jd = &mut serde_json::Deserializer::from_str(&self); + serde_path_to_error::deserialize(jd).context(crate::error::JSON) + } +} + +impl DeserializeJsonWithPath for reqwest::blocking::Response { + fn json_with_path<T: serde::de::DeserializeOwned>(self) -> Result<T> { + let bytes = self.bytes().context(crate::error::Reqwest)?; + let jd = &mut serde_json::Deserializer::from_slice(&bytes); + serde_path_to_error::deserialize(jd).context(crate::error::JSON) + } +} + +#[async_trait::async_trait] +pub trait DeserializeJsonWithPathAsync { + async fn json_with_path<T: serde::de::DeserializeOwned>( + self, + ) -> Result<T>; +} + +#[async_trait::async_trait] +impl DeserializeJsonWithPathAsync for reqwest::Response { + async fn json_with_path<T: serde::de::DeserializeOwned>( + self, + ) -> Result<T> { + let bytes = self.bytes().await.context(crate::error::Reqwest)?; + let jd = &mut serde_json::Deserializer::from_slice(&bytes); + serde_path_to_error::deserialize(jd).context(crate::error::JSON) + } +} |