Skip to main content

ntex_net/connect/
error.rs

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