aboutsummaryrefslogtreecommitdiffstats
path: root/src/json.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2020-05-23 16:16:25 -0400
committerJesse Luehrs <doy@tozt.net>2020-05-23 16:16:25 -0400
commit80acb66445a612798ddf74bd6df60b51fd674fa0 (patch)
tree9c6b5fe2cb6bf33c79523a2ab2dcd9d0124c3e32 /src/json.rs
parentc9473e0b61bc9d8264a6ce939ed74c3d9b8f4db5 (diff)
downloadrbw-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.rs38
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)
+ }
+}