Skip to main content

ntex_net/connect/
error.rs

1use std::io;
2
3use ntex_error::{ErrorDiagnostic, ResultType};
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 typ(&self) -> ResultType {
59        match self {
60            ConnectError::InvalidInput => ResultType::ClientError,
61            ConnectError::Resolver(_)
62            | ConnectError::NoRecords
63            | ConnectError::Unresolved => ResultType::ServiceError,
64            ConnectError::Io(err) => err.typ(),
65        }
66    }
67
68    fn signature(&self) -> &'static str {
69        match self {
70            ConnectError::InvalidInput => "ntex-connect-InvalidInput",
71            ConnectError::Resolver(_) => "ntex-connect-Resolver",
72            ConnectError::NoRecords => "ntex-connect-NoRecords",
73            ConnectError::Unresolved => "ntex-connect-Unresolved",
74            ConnectError::Io(err) => err.signature(),
75        }
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    #[test]
84    #[allow(clippy::redundant_clone)]
85    fn connect_error_clone() {
86        let _ = ConnectError::Resolver(io::Error::other("test")).clone();
87        let _ = ConnectError::NoRecords.clone();
88        let _ = ConnectError::InvalidInput.clone();
89        let _ = ConnectError::Unresolved.clone();
90        let _ = ConnectError::Io(io::Error::other("test")).clone();
91    }
92
93    #[test]
94    fn error_diagnostic() {
95        let err = ConnectError::InvalidInput;
96        assert_eq!(err.typ(), ResultType::ClientError);
97        assert_eq!(err.signature(), "ntex-connect-InvalidInput");
98
99        let err = ConnectError::Resolver(io::Error::other("test"));
100        assert_eq!(err.typ(), ResultType::ServiceError);
101        assert_eq!(err.signature(), "ntex-connect-Resolver");
102
103        let err = ConnectError::NoRecords;
104        assert_eq!(err.typ(), ResultType::ServiceError);
105        assert_eq!(err.signature(), "ntex-connect-NoRecords");
106
107        let err = ConnectError::Unresolved;
108        assert_eq!(err.typ(), ResultType::ServiceError);
109        assert_eq!(err.signature(), "ntex-connect-Unresolved");
110
111        let err = ConnectError::Io(io::Error::new(io::ErrorKind::InvalidInput, "test"));
112        assert_eq!(err.typ(), ResultType::ClientError);
113        assert_eq!(err.signature(), "io-InvalidInput");
114
115        let err = ConnectError::Io(io::Error::other("test"));
116        assert_eq!(err.typ(), ResultType::ServiceError);
117        assert_eq!(err.signature(), "io-Error");
118    }
119}