1 use { 2 failure::{Backtrace, Fail}, 3 bytesio::bytes_errors::{BytesReadError, BytesWriteError}, 4 std::fmt, 5 }; 6 7 #[derive(Debug, Fail)] 8 pub enum UnpackErrorValue { 9 #[fail(display = "bytes read error: {}\n", _0)] 10 BytesReadError(BytesReadError), 11 #[fail(display = "unknow read state")] 12 UnknowReadState, 13 #[fail(display = "empty chunks")] 14 EmptyChunks, 15 //IO(io::Error), 16 } 17 18 #[derive(Debug)] 19 pub struct UnpackError { 20 pub value: UnpackErrorValue, 21 } 22 23 impl From<UnpackErrorValue> for UnpackError { 24 fn from(val: UnpackErrorValue) -> Self { 25 UnpackError { value: val } 26 } 27 } 28 29 impl From<BytesReadError> for UnpackError { 30 fn from(error: BytesReadError) -> Self { 31 UnpackError { 32 value: UnpackErrorValue::BytesReadError(error), 33 } 34 } 35 } 36 37 #[derive(Debug, Fail)] 38 pub enum PackErrorValue { 39 #[fail(display = "not exist header")] 40 NotExistHeader, 41 #[fail(display = "unknow read state")] 42 UnknowReadState, 43 #[fail(display = "bytes writer error: {}\n", _0)] 44 BytesWriteError(BytesWriteError), 45 } 46 47 #[derive(Debug)] 48 pub struct PackError { 49 pub value: PackErrorValue, 50 } 51 52 impl From<PackErrorValue> for PackError { 53 fn from(val: PackErrorValue) -> Self { 54 PackError { value: val } 55 } 56 } 57 58 impl From<BytesWriteError> for PackError { 59 fn from(error: BytesWriteError) -> Self { 60 PackError { 61 value: PackErrorValue::BytesWriteError(error), 62 } 63 } 64 } 65 66 impl fmt::Display for PackError { 67 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 68 fmt::Display::fmt(&self.value, f) 69 } 70 } 71 72 impl Fail for PackError { 73 fn cause(&self) -> Option<&dyn Fail> { 74 self.value.cause() 75 } 76 77 fn backtrace(&self) -> Option<&Backtrace> { 78 self.value.backtrace() 79 } 80 } 81 82 impl fmt::Display for UnpackError { 83 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 84 fmt::Display::fmt(&self.value, f) 85 } 86 } 87 88 impl Fail for UnpackError { 89 fn cause(&self) -> Option<&dyn Fail> { 90 self.value.cause() 91 } 92 93 fn backtrace(&self) -> Option<&Backtrace> { 94 self.value.backtrace() 95 } 96 } 97