use serde_derive::{Deserialize, Serialize}; #[derive(Debug)] pub enum TdlibSysError { LogLevelOutOfBounds(u16), Nul(usize), UtfDecode, CannotSetLogFile, } impl std::error::Error for TdlibSysError {} impl std::convert::From for TdlibSysError { fn from(nul_err: std::ffi::NulError) -> Self { Self::Nul(nul_err.nul_position()) } } impl std::fmt::Display for TdlibSysError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use TdlibSysError::*; match self { LogLevelOutOfBounds(lvl) => { write!(f, "Log level should be less than 1024. Found {}", lvl) } Nul(pos) => write!(f, "String contains nul byte at pos: {}", pos), UtfDecode => write!(f, "String is not utf8 encoded"), CannotSetLogFile => write!(f, "Could not set log file"), } } } #[derive(Debug, thiserror::Error)] pub enum TgError { /// Something went wrong, when (de)serializing shit #[error("Something went wrong, when (de)serializing shit: {}", .0)] Serde(#[from] serde_json::Error), /// tdlib-sys error #[error("tdlib-sys error: {}", .0)] TdSys(#[from] TdlibSysError), #[error("@type must not be in your structure used as Request")] HasTypeInJson, #[error("@type must be string in JsonValue used as Request")] HasNoTypeInJson, #[error("json is invalid: {}", .0)] InvalidJson(String), #[error("core channel has been closed unexpectedly")] ChannelClosed, #[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 std::convert::From> for TgError { fn from(_: crossbeam::channel::SendError) -> Self { Self::ChannelClosed } } pub type Error = TgError; pub type Result = std::result::Result;