use thiserror::Error;
#[derive(Debug, Clone, Error)]
pub enum NetworkError {
#[error("identity not found: {0}")]
IdentityNotFound(String),
#[error("authentication failed: {0}")]
AuthenticationFailed(String),
#[error("connection failed: {0}")]
ConnectionFailed(String),
#[error("not connected: {0}")]
NotConnected(String),
#[error("send failed: {0}")]
SendFailed(String),
#[error("receive failed: {0}")]
ReceiveFailed(String),
#[error("routing failed: {0}")]
RoutingFailed(String),
#[error("no route to peer: {0}")]
NoRoute(String),
#[error("discovery failed: {0}")]
DiscoveryFailed(String),
#[error("registration failed: {0}")]
RegistrationFailed(String),
#[error("peer not found: {0}")]
PeerNotFound(String),
#[error("federation denied: {0}")]
FederationDenied(String),
#[error("invalid state: {0}")]
InvalidState(String),
#[error("internal error: {0}")]
Internal(String),
#[error("timeout: {0}")]
Timeout(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_display_messages() {
let cases: Vec<(NetworkError, &str)> = vec![
(
NetworkError::IdentityNotFound("agent-x".into()),
"identity not found: agent-x",
),
(
NetworkError::ConnectionFailed("refused".into()),
"connection failed: refused",
),
(
NetworkError::RoutingFailed("no path".into()),
"routing failed: no path",
),
(
NetworkError::DiscoveryFailed("timeout".into()),
"discovery failed: timeout",
),
(
NetworkError::PeerNotFound("abc".into()),
"peer not found: abc",
),
(
NetworkError::FederationDenied("policy".into()),
"federation denied: policy",
),
(NetworkError::Timeout("5s".into()), "timeout: 5s"),
];
for (err, expected) in cases {
assert_eq!(err.to_string(), expected);
}
}
#[test]
fn error_is_std_error() {
let err = NetworkError::Internal("test".into());
let _: &dyn std::error::Error = &err;
}
#[test]
fn error_clone() {
let err = NetworkError::SendFailed("broken pipe".into());
let cloned = err.clone();
assert_eq!(err.to_string(), cloned.to_string());
}
}