diff options
author | syn <isaqtm@gmail.com> | 2021-01-09 01:21:51 +0300 |
---|---|---|
committer | syn <isaqtm@gmail.com> | 2021-01-09 01:21:51 +0300 |
commit | 54795617329866fad87d52aa36452ac53ac899b7 (patch) | |
tree | ae3a853e51d7a2a7020e9b266d3699287f884902 | |
parent | 45e682780819656820acc333dc0400f30cbd9595 (diff) | |
download | tdlib-rs-54795617329866fad87d52aa36452ac53ac899b7.tar.gz |
accept errors from telegram
-rw-r--r-- | src/client/responder.rs | 27 | ||||
-rw-r--r-- | src/error.rs | 12 |
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 { |