diameter/
error.rs

1use std::fmt;
2use std::result::Result as StdResult;
3use std::sync::{MutexGuard, PoisonError};
4
5/// Error type returned by `diameter` methods.
6#[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
20/// `Result` type used by `diameter`'s API.
21pub 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
42// io error
43impl From<std::io::Error> for Error {
44    fn from(err: std::io::Error) -> Self {
45        Error::IoError(err)
46    }
47}
48
49// try from slice error
50impl From<std::array::TryFromSliceError> for Error {
51    fn from(err: std::array::TryFromSliceError) -> Error {
52        Error::TryFromSliceError(err)
53    }
54}
55
56// lock error
57impl<'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}