dust_mail/discover/
error.rs1use 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>;