Skip to main content

rusty_modbus_tcp/
error.rs

1//! Transport error types.
2
3use rusty_modbus_frame::FrameError;
4use rusty_modbus_types::FunctionCode;
5
6/// Errors that can occur during transport operations.
7#[derive(Debug, thiserror::Error)]
8pub enum TransportError {
9    /// Underlying I/O error.
10    #[error("I/O error: {0}")]
11    Io(#[from] std::io::Error),
12
13    /// Frame-level error (decode, encode, CRC, protocol ID).
14    #[error("frame error: {0}")]
15    Frame(#[from] FrameError),
16
17    /// Operation timed out.
18    #[error("operation timed out")]
19    Timeout,
20
21    /// Connection was closed by the remote peer.
22    #[error("disconnected")]
23    Disconnected,
24
25    /// Connection denied by access control.
26    #[error("access denied")]
27    AccessDenied,
28
29    /// TLS handshake failure (used by `modbus-tls`, defined here for `TransportError` unification).
30    #[error("TLS handshake failed: {0}")]
31    TlsHandshake(String),
32
33    /// Authorization denied by server policy.
34    #[error("authorization denied for role {role:?} on {function_code}")]
35    AuthorizationDenied {
36        /// Client role from certificate (if any).
37        role: Option<String>,
38        /// The function code that was denied.
39        function_code: FunctionCode,
40    },
41}
42
43/// TCP-specific error type (wraps `TransportError` for TCP context).
44pub type TcpError = TransportError;