use { bytesio::bytes_errors::{BytesReadError, BytesWriteError}, failure::{Backtrace, Fail}, std::{fmt, io::Error, time::SystemTimeError}, }; #[derive(Debug, Fail)] pub enum HandshakeErrorValue { #[fail(display = "bytes read error: {}", _0)] BytesReadError(BytesReadError), #[fail(display = "bytes write error: {}", _0)] BytesWriteError(BytesWriteError), #[fail(display = "system time error: {}", _0)] SysTimeError(SystemTimeError), #[fail(display = "digest error: {}", _0)] DigestError(DigestError), #[fail(display = "Digest not found error")] DigestNotFound, #[fail(display = "s0 version not correct error")] S0VersionNotCorrect, #[fail(display = "io error")] IOError(Error), } impl From for HandshakeError { fn from(error: Error) -> Self { HandshakeError { value: HandshakeErrorValue::IOError(error), } } } #[derive(Debug)] pub struct HandshakeError { pub value: HandshakeErrorValue, } impl From for HandshakeError { fn from(val: HandshakeErrorValue) -> Self { HandshakeError { value: val } } } impl From for HandshakeError { fn from(error: BytesReadError) -> Self { HandshakeError { value: HandshakeErrorValue::BytesReadError(error), } } } impl From for HandshakeError { fn from(error: BytesWriteError) -> Self { HandshakeError { value: HandshakeErrorValue::BytesWriteError(error), } } } impl From for HandshakeError { fn from(error: SystemTimeError) -> Self { HandshakeError { value: HandshakeErrorValue::SysTimeError(error), } } } impl From for HandshakeError { fn from(error: DigestError) -> Self { HandshakeError { value: HandshakeErrorValue::DigestError(error), } } } impl fmt::Display for HandshakeError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.value, f) } } impl Fail for HandshakeError { fn cause(&self) -> Option<&dyn Fail> { self.value.cause() } fn backtrace(&self) -> Option<&Backtrace> { self.value.backtrace() } } #[derive(Debug)] pub struct DigestError { pub value: DigestErrorValue, } #[derive(Debug, Fail)] pub enum DigestErrorValue { #[fail(display = "bytes read error: {}", _0)] BytesReadError(BytesReadError), #[fail(display = "digest length not correct")] DigestLengthNotCorrect, #[fail(display = "cannot generate digest")] CannotGenerate, #[fail(display = "unknow schema")] UnknowSchema, } impl From for DigestError { fn from(error: BytesReadError) -> Self { DigestError { value: DigestErrorValue::BytesReadError(error), } } } impl fmt::Display for DigestError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fmt::Display::fmt(&self.value, f) } } impl Fail for DigestError { fn cause(&self) -> Option<&dyn Fail> { self.value.cause() } fn backtrace(&self) -> Option<&Backtrace> { self.value.backtrace() } }