1use std::{fmt, io};
4
5#[cfg(feature = "tls")]
6use crate::types::tls::TlsError;
7use crate::{types::Sid, util};
8
9use tokio::time;
10
11#[derive(Debug)]
13pub enum Error {
14 ExceedsMaxPayload {
16 tried: usize,
18 limit: usize,
20 },
21 InvalidAddress(String),
23 #[cfg(feature = "rustls-tls")]
25 InvalidDnsName(String),
26 InvalidNetworkScheme(String),
29 InvalidServerControl(String),
31 InvalidSubject(String),
33 InvalidTerminator(Vec<u8>),
35 Io(io::Error),
37 #[cfg(feature = "tls")]
39 Tls(TlsError),
40 NoResponse,
43 NotConnected,
46 NotEnoughData,
48 Timeout(time::error::Elapsed),
51 TlsDisabled,
53 UnknownSid(Sid),
56}
57
58impl Error {
59 pub fn not_connected(&self) -> bool {
61 matches!(self, Self::NotConnected)
62 }
63}
64
65impl fmt::Display for Error {
66 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
67 match self {
68 Error::ExceedsMaxPayload { tried, limit } => {
69 write!(f, "'{}' exceeds max payload '{}'", tried, limit)
70 }
71 Error::InvalidAddress(address) => write!(f, "invalid address {:?}", address),
72 #[cfg(feature = "rustls-tls")]
73 Error::InvalidDnsName(input) => write!(f, "invalid DNS name '{}'", input),
74 Error::InvalidServerControl(line) => write!(f, "invalid control line {:?}", line),
75 Error::InvalidSubject(subject) => write!(f, "invalid subject {:?}", subject),
76 Error::InvalidTerminator(terminator) => {
77 write!(f, "invalid message terminator {:?}", terminator)
78 }
79 Error::Io(e) => write!(f, "{}", e),
80 #[cfg(feature = "tls")]
81 Error::Tls(e) => write!(f, "{}", e),
82 Error::NoResponse => write!(f, "no response"),
83 Error::NotConnected => write!(f, "not connected"),
84 Error::NotEnoughData => write!(f, "not enough data"),
85 Error::InvalidNetworkScheme(protocol) => write!(
86 f,
87 "invalid scheme '{}' only '{}' is supported",
88 protocol,
89 util::NATS_NETWORK_SCHEME
90 ),
91 Error::UnknownSid(sid) => write!(f, "unknown sid '{}'", sid),
92 Error::Timeout(e) => write!(f, "{}", e),
93 Error::TlsDisabled => write!(f, "no TLS connector specified"),
94 }
95 }
96}
97
98impl std::error::Error for Error {}
99
100impl From<tokio::time::error::Elapsed> for Error {
101 fn from(e: tokio::time::error::Elapsed) -> Self {
102 Error::Timeout(e)
103 }
104}
105
106impl From<io::Error> for Error {
107 fn from(e: io::Error) -> Self {
108 Error::Io(e)
109 }
110}
111
112#[cfg(feature = "tls")]
113impl From<TlsError> for Error {
114 fn from(e: TlsError) -> Self {
115 Error::Tls(e)
116 }
117}
118
119pub type Result<T> = std::result::Result<T, Error>;