minint/
error.rs

1use rmp::decode::{bytes::BytesReadError, ValueReadError};
2use std::error::Error;
3use std::fmt::{self, Display};
4use tokio_tungstenite::tungstenite::Error as TungsteniteError;
5
6/// Custom error types for NetworkTables operations
7#[derive(Debug)]
8pub enum NtError {
9    /// Error during connection establishment
10    ConnectionError(String),
11    /// Error with websocket communication
12    WebsocketError(String),
13    /// Error with MessagePack encoding/decoding
14    MessagePackError(String),
15    /// Error with JSON serialization/deserialization
16    JsonError(String),
17    /// Error with message sending
18    SendError(String),
19    /// Generic IO error
20    IoError(String),
21    /// Topic not found
22    TopicNotFound(String),
23    /// Binary frame parsing error
24    BinaryFrameError,
25    /// Lock acquisition error
26    LockError(String),
27    /// Other errors
28    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
54// Implement From traits for various error types
55impl 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
97// Type alias for Result with NtError
98pub type Result<T> = std::result::Result<T, NtError>;