1use std::fmt;
2use std::result::Result as StdResult;
3use std::sync::{MutexGuard, PoisonError};
4
5#[derive(Debug)]
7pub enum Error {
8 DecodeError(String),
9 EncodeError(String),
10 UnknownAvpCode(u32),
11 UnknownAvpName(String),
12 ClientError(String),
13 ServerError(String),
14 IoError(std::io::Error),
15 TryFromSliceError(std::array::TryFromSliceError),
16 LockError(String),
17 NativeTlsError(native_tls::Error),
18}
19
20pub type Result<T> = StdResult<T, Error>;
22
23impl fmt::Display for Error {
24 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
25 match self {
26 Error::DecodeError(msg) => write!(f, "{}", msg),
27 Error::EncodeError(msg) => write!(f, "{}", msg),
28 Error::UnknownAvpCode(code) => write!(f, "Unknown AVP code: {}", code),
29 Error::UnknownAvpName(name) => write!(f, "Unknown AVP name: {}", name),
30 Error::ClientError(msg) => write!(f, "{}", msg),
31 Error::ServerError(msg) => write!(f, "{}", msg),
32 Error::IoError(e) => write!(f, "{}", e),
33 Error::TryFromSliceError(e) => write!(f, "{}", e),
34 Error::LockError(msg) => write!(f, "{}", msg),
35 Error::NativeTlsError(e) => write!(f, "{}", e),
36 }
37 }
38}
39
40impl std::error::Error for Error {}
41
42impl From<std::io::Error> for Error {
44 fn from(err: std::io::Error) -> Self {
45 Error::IoError(err)
46 }
47}
48
49impl From<std::array::TryFromSliceError> for Error {
51 fn from(err: std::array::TryFromSliceError) -> Error {
52 Error::TryFromSliceError(err)
53 }
54}
55
56impl<'a, T> From<PoisonError<MutexGuard<'a, T>>> for Error {
58 fn from(err: PoisonError<MutexGuard<'a, T>>) -> Self {
59 Error::LockError(format!("Lock error: {}", err))
60 }
61}
62
63impl From<native_tls::Error> for Error {
64 fn from(err: native_tls::Error) -> Self {
65 Error::NativeTlsError(err)
66 }
67}