summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsyn <isaqtm@gmail.com>2021-01-09 01:21:51 +0300
committersyn <isaqtm@gmail.com>2021-01-09 01:21:51 +0300
commit54795617329866fad87d52aa36452ac53ac899b7 (patch)
treeae3a853e51d7a2a7020e9b266d3699287f884902
parent45e682780819656820acc333dc0400f30cbd9595 (diff)
downloadtdlib-rs-54795617329866fad87d52aa36452ac53ac899b7.tar.gz
accept errors from telegram
-rw-r--r--src/client/responder.rs27
-rw-r--r--src/error.rs12
2 files changed, 25 insertions, 14 deletions
diff --git a/src/client/responder.rs b/src/client/responder.rs
index 6f5dd53..f501102 100644
--- a/src/client/responder.rs
+++ b/src/client/responder.rs
@@ -5,7 +5,7 @@ use crate::{raw_ptr::TdPtr, Handler};
use super::{JoinStreams, SafeResponse};
use crossbeam::channel::{Receiver, Sender};
-use log::{error, trace, warn};
+use log::{error, info, trace, warn};
use serde_json::Value as JsonValue;
/// Oneshot means it forgets any information about particular request
@@ -120,16 +120,20 @@ impl<H: Handler> OneshotResponder<H> {
if let Some(id) = resp["@extra"].as_u64() {
if let Some(fut) = self.wakers_map.remove(&id) {
let mut fut_data = fut.lock().unwrap();
- fut_data.resp = Some(Ok(resp));
+ use crate::error::Error;
+ let err = match serde_json::from_value(resp) {
+ Ok(tg_err) => Error::TelegramError(tg_err),
+ Err(serde_err) => Error::Serde(serde_err),
+ };
+ fut_data.resp = Some(Err(err));
fut_data.waker.as_ref().map(Waker::wake_by_ref);
} else {
- warn!(
- "response received, but request was not issued by any future: {}",
- resp
- );
+ warn!("response received, but request was not issued by any future");
+ info!("response was: {}", resp);
}
} else {
- warn!("response has invalid @extra: {}", resp);
+ warn!("response has invalid @extra: {:?}", resp["extra"]);
+ info!("full response was: {}", resp);
}
}
@@ -140,13 +144,12 @@ impl<H: Handler> OneshotResponder<H> {
fut_data.resp = Some(Ok(resp));
fut_data.waker.as_ref().map(Waker::wake_by_ref);
} else {
- warn!(
- "response received, but request was not issued by any future: {}",
- resp
- );
+ warn!("response received, but request was not issued by any future");
+ info!("response was: {}", resp);
}
} else {
- warn!("response has invalid @extra: {}", resp);
+ warn!("response has invalid @extra: {:?}", resp["extra"]);
+ info!("full response was: {}", resp);
}
}
}
diff --git a/src/error.rs b/src/error.rs
index f7796b8..b58dd5d 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -1,3 +1,5 @@
+use serde_derive::{Deserialize, Serialize};
+
#[derive(Debug)]
pub enum TdlibSysError {
LogLevelOutOfBounds(u16),
@@ -50,8 +52,14 @@ pub enum TgError {
#[error("core channel has been closed unexpectedly")]
ChannelClosed,
- #[error("telegram replied with error code: {code} and message: {msg}")]
- TelegramError { code: i32, msg: String },
+ #[error("telegram replied with error code: {} and message: {}", .0.code, .0.msg)]
+ TelegramError(TelegramError),
+}
+
+#[derive(Debug, Serialize, Deserialize)]
+pub struct TelegramError {
+ code: i32,
+ msg: String,
}
impl<T> std::convert::From<crossbeam::channel::SendError<T>> for TgError {