1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
use std::error; use std::fmt; use std::io; use std::string::FromUtf8Error; use thiserror::Error; #[derive(Error, Debug)] pub enum OrientError { #[error("")] Io(#[from] io::Error), #[error("Request error: {}", .0.errors[0].err_msg)] Request(RequestError), #[error("Protocol error: {0}")] Protocol(String), #[error("Decoder error: {0}")] Decoder(String), #[error("UTF8 error: {0}")] UTF8(#[from] FromUtf8Error), #[error("Pool error: {0}")] Pool(#[from] r2d2::Error), #[error("Field error: {0}")] Field(String), #[error("Conversion error: {0}")] Conversion(String), #[error("Generic error: {0}")] Generic(String), #[cfg(feature = "async")] #[error("Channel send error: {0}")] ChannelSend(#[from] futures::channel::mpsc::SendError), } #[derive(Default)] pub struct RequestError { pub session_id: i32, pub code: i32, pub identifier: i32, pub errors: Vec<OError>, pub serialized: Vec<u8>, } #[derive(Debug)] pub struct OError { pub err_type: String, pub err_msg: String, } impl OError { pub fn new(err_type: String, err_msg: String) -> OError { OError { err_type, err_msg } } } impl error::Error for RequestError { fn description(&self) -> &str { &self.errors[0].err_msg } fn cause(&self) -> Option<&dyn error::Error> { None } } impl RequestError { pub fn new() -> RequestError { RequestError { code: -1, identifier: -1, session_id: -1, errors: vec![], serialized: vec![], } } pub fn new_with_code(code: i32, identifier: i32) -> RequestError { RequestError { code, identifier, session_id: -1, errors: vec![], serialized: vec![], } } pub fn add_error(&mut self, err: OError) { self.errors.push(err); } } impl fmt::Display for RequestError { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { fmt.debug_struct("RequestError") .field("session_id", &self.session_id) .field("code", &self.code) .field("identifier", &self.identifier) .field("type", &self.errors[0].err_type) .field("message", &self.errors[0].err_msg) .finish() } } impl std::fmt::Debug for RequestError { fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { fmt.debug_struct("RequestError") .field("session_id", &self.session_id) .field("code", &self.code) .field("identifier", &self.identifier) .field("type", &self.errors[0].err_type) .field("message", &self.errors[0].err_msg) .finish() } }