1use rmp::decode::{bytes::BytesReadError, ValueReadError};
2use std::error::Error;
3use std::fmt::{self, Display};
4use tokio_tungstenite::tungstenite::Error as TungsteniteError;
5
6#[derive(Debug)]
8pub enum NtError {
9 ConnectionError(String),
11 WebsocketError(String),
13 MessagePackError(String),
15 JsonError(String),
17 SendError(String),
19 IoError(String),
21 TopicNotFound(String),
23 BinaryFrameError,
25 LockError(String),
27 Other(String),
29 NeedReconnect,
30 TimeOverflow,
31}
32
33impl Display for NtError {
34 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
35 match self {
36 NtError::ConnectionError(msg) => write!(f, "Connection error: {msg}"),
37 NtError::WebsocketError(msg) => write!(f, "Websocket error: {msg}"),
38 NtError::MessagePackError(msg) => write!(f, "MessagePack error: {msg}"),
39 NtError::JsonError(msg) => write!(f, "JSON error: {msg}"),
40 NtError::SendError(msg) => write!(f, "Send error: {msg}"),
41 NtError::IoError(msg) => write!(f, "IO error: {msg}"),
42 NtError::TopicNotFound(msg) => write!(f, "Topic not found: {msg}"),
43 NtError::BinaryFrameError => write!(f, "Failed to parse binary frame"),
44 NtError::LockError(msg) => write!(f, "Lock error: {msg}"),
45 NtError::Other(msg) => write!(f, "Error: {msg}"),
46 NtError::NeedReconnect => write!(f, "Disconnected from NT server! Must reconnect"),
47 NtError::TimeOverflow => write!(f, "Time overflow"),
48 }
49 }
50}
51
52impl Error for NtError {}
53
54impl From<std::io::Error> for NtError {
56 fn from(err: std::io::Error) -> Self {
57 NtError::IoError(err.to_string())
58 }
59}
60
61impl From<TungsteniteError> for NtError {
62 fn from(err: TungsteniteError) -> Self {
63 NtError::WebsocketError(err.to_string())
64 }
65}
66
67impl From<serde_json::Error> for NtError {
68 fn from(err: serde_json::Error) -> Self {
69 NtError::JsonError(err.to_string())
70 }
71}
72
73impl From<rmp::encode::ValueWriteError> for NtError {
74 fn from(err: rmp::encode::ValueWriteError) -> Self {
75 NtError::MessagePackError(err.to_string())
76 }
77}
78
79impl From<rmp::decode::ValueReadError> for NtError {
80 fn from(err: rmp::decode::ValueReadError) -> Self {
81 NtError::MessagePackError(format!("{:?}", err))
82 }
83}
84
85impl From<ValueReadError<BytesReadError>> for NtError {
86 fn from(err: ValueReadError<BytesReadError>) -> Self {
87 NtError::MessagePackError(format!("{:?}", err))
88 }
89}
90
91impl From<tokio_tungstenite::tungstenite::http::Error> for NtError {
92 fn from(err: tokio_tungstenite::tungstenite::http::Error) -> Self {
93 NtError::ConnectionError(err.to_string())
94 }
95}
96
97pub type Result<T> = std::result::Result<T, NtError>;