ntex_net/connect/
error.rs1use std::io;
2
3use ntex_error::{ErrorDiagnostic, ResultType};
4
5#[derive(thiserror::Error, Debug, Copy, Clone)]
6pub enum ConnectServiceError {
7 #[error("Cannot create connect service")]
9 CannotCreateService,
10}
11
12#[derive(thiserror::Error, Debug)]
13pub enum ConnectError {
14 #[error("Failed resolving hostname: {0}")]
16 Resolver(io::Error),
17
18 #[error("No dns records found for the input")]
20 NoRecords,
21
22 #[error("Invalid input")]
24 InvalidInput,
25
26 #[error("Connector received `Connect` method with unresolved host")]
28 Unresolved,
29
30 #[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}