Skip to main content

ntex_net/connect/
error.rs

1use std::io;
2
3use ntex_error::ErrorDiagnostic;
4
5#[derive(thiserror::Error, Debug, Copy, Clone)]
6pub enum ConnectServiceError {
7    /// Cannot create connect service
8    #[error("Cannot create connect service")]
9    CannotCreateService,
10}
11
12#[derive(thiserror::Error, Debug)]
13pub enum ConnectError {
14    /// Failed to resolve the hostname
15    #[error("Failed resolving hostname: {0}")]
16    Resolver(io::Error),
17
18    /// No dns records
19    #[error("No dns records found for the input")]
20    NoRecords,
21
22    /// Invalid input
23    #[error("Invalid input")]
24    InvalidInput,
25
26    /// Unresolved host name
27    #[error("Connector received `Connect` method with unresolved host")]
28    Unresolved,
29
30    /// Connection io error
31    #[error("{0}")]
32    Io(#[from] io::Error),
33}
34
35impl Clone for ConnectError {
36    fn clone(&self) -> Self {
37        match self {
38            ConnectError::Resolver(err) => {
39                ConnectError::Resolver(io::Error::new(err.kind(), format!("{err}")))
40            }
41            ConnectError::NoRecords => ConnectError::NoRecords,
42            ConnectError::InvalidInput => ConnectError::InvalidInput,
43            ConnectError::Unresolved => ConnectError::Unresolved,
44            ConnectError::Io(err) => {
45                ConnectError::Io(io::Error::new(err.kind(), format!("{err}")))
46            }
47        }
48    }
49}
50
51impl From<ConnectServiceError> for io::Error {
52    fn from(err: ConnectServiceError) -> io::Error {
53        io::Error::other(err)
54    }
55}
56
57impl ErrorDiagnostic for ConnectError {
58    fn signature(&self) -> &'static str {
59        match self {
60            ConnectError::InvalidInput => "ntex-connect-InvalidInput",
61            ConnectError::Resolver(_) => "ntex-connect-Resolver",
62            ConnectError::NoRecords => "ntex-connect-NoRecords",
63            ConnectError::Unresolved => "ntex-connect-Unresolved",
64            ConnectError::Io(err) => err.signature(),
65        }
66    }
67}
68
69#[cfg(test)]
70mod tests {
71    use super::*;
72
73    #[test]
74    #[allow(clippy::redundant_clone)]
75    fn connect_error_clone() {
76        let _ = ConnectError::Resolver(io::Error::other("test")).clone();
77        let _ = ConnectError::NoRecords.clone();
78        let _ = ConnectError::InvalidInput.clone();
79        let _ = ConnectError::Unresolved.clone();
80        let _ = ConnectError::Io(io::Error::other("test")).clone();
81    }
82
83    #[test]
84    fn error_diagnostic() {
85        let err = ConnectError::InvalidInput;
86        assert_eq!(err.signature(), "ntex-connect-InvalidInput");
87
88        let err = ConnectError::Resolver(io::Error::other("test"));
89        assert_eq!(err.signature(), "ntex-connect-Resolver");
90
91        let err = ConnectError::NoRecords;
92        assert_eq!(err.signature(), "ntex-connect-NoRecords");
93
94        let err = ConnectError::Unresolved;
95        assert_eq!(err.signature(), "ntex-connect-Unresolved");
96
97        let err = ConnectError::Io(io::Error::new(io::ErrorKind::InvalidInput, "test"));
98        assert_eq!(err.signature(), "io-InvalidInput");
99
100        let err = ConnectError::Io(io::Error::other("test"));
101        assert_eq!(err.signature(), "io-Error");
102    }
103}