dust_mail/discover/
error.rs

1use std::{error, fmt::Display, result};
2
3#[cfg(feature = "autoconfig")]
4use autoconfig::error::Error as AutoconfigError;
5#[cfg(feature = "autodiscover")]
6use ms_autodiscover::error::Error as AutodiscoverError;
7
8use dns_mail_discover::error::Error as DnsDiscoverError;
9
10#[derive(Debug)]
11pub enum ErrorKind {
12    InvalidEmailAddress,
13    InvalidConfig,
14    NotFound(Vec<Error>),
15    DnsDiscover(DnsDiscoverError),
16    #[cfg(feature = "autoconfig")]
17    Autoconfig(AutoconfigError),
18    #[cfg(feature = "autodiscover")]
19    Autodiscover(AutodiscoverError),
20}
21
22#[derive(Debug)]
23pub struct Error {
24    message: String,
25    kind: ErrorKind,
26}
27
28impl Error {
29    pub fn new<M: Into<String>>(kind: ErrorKind, message: M) -> Self {
30        Self {
31            message: message.into(),
32            kind,
33        }
34    }
35
36    pub fn kind(&self) -> &ErrorKind {
37        &self.kind
38    }
39}
40
41impl error::Error for Error {}
42
43impl Display for Error {
44    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45        write!(f, "Error: {}", self.message)
46    }
47}
48
49#[cfg(feature = "autoconfig")]
50impl From<AutoconfigError> for Error {
51    fn from(autoconfig_error: AutoconfigError) -> Self {
52        Error::new(
53            ErrorKind::Autoconfig(autoconfig_error),
54            "Failed to retrieve config using autoconfig protocol",
55        )
56    }
57}
58
59#[cfg(feature = "autodiscover")]
60impl From<AutodiscoverError> for Error {
61    fn from(error: AutodiscoverError) -> Self {
62        Error::new(
63            ErrorKind::Autodiscover(error),
64            "Failed to retrieve config using autodiscover protocol",
65        )
66    }
67}
68
69impl From<DnsDiscoverError> for Error {
70    fn from(error: DnsDiscoverError) -> Self {
71        Error::new(
72            ErrorKind::DnsDiscover(error),
73            "Failed to retrieve config using dns mail discover protocol",
74        )
75    }
76}
77
78macro_rules! err {
79    ($kind:expr, $($arg:tt)*) => {{
80		use crate::discover::error::Error;
81
82        let kind = $kind;
83        let message = format!($($arg)*);
84        return Err(Error::new( kind, message ));
85    }};
86}
87
88pub(crate) use err;
89
90pub type Result<T> = result::Result<T, Error>;