use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
Protocol(#[from] crate::protocol::Error),
#[error("Unexpected discovery message: {0:?}")]
UnexpectedDiscoveryMessage(crate::protocol::Header),
#[error("Socket Closed Unexpectedly")]
SocketClosedUnexpectedly,
#[error("Unicast Socket not bound")]
UnicastSocketNotBound,
#[error("Service not found in endpoint registry")]
ServiceNotFound,
#[error("Endpoint not supported by this client's transports (IPv4/UDP only): {0:?}")]
UnsupportedEndpoint(crate::NetEndpoint),
#[error(transparent)]
E2e(#[from] crate::e2e::Error),
#[error("internal capacity exceeded: {0}")]
Capacity(&'static str),
#[error(transparent)]
Transport(#[from] crate::transport::TransportError),
#[error("client run loop is no longer running")]
Shutdown,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::transport::TransportError;
use std::format;
#[test]
fn transport_variant_displays_via_inner_display_not_debug() {
let err = Error::Transport(TransportError::AddressInUse);
let displayed = format!("{err}");
assert!(
!displayed.contains('{'),
"unexpected `{{` in Display output: {displayed:?}"
);
assert!(
!displayed.contains('}'),
"unexpected `}}` in Display output: {displayed:?}"
);
assert!(
!displayed.contains('"'),
"unexpected `\"` in Display output: {displayed:?}"
);
let inner = format!("{}", TransportError::AddressInUse);
assert_eq!(displayed, inner);
assert_eq!(displayed, "address in use");
}
#[test]
fn capacity_variant_includes_tag_in_display() {
let err = Error::Capacity("request_queue");
let displayed = format!("{err}");
assert!(
displayed.contains("request_queue"),
"Capacity display must include the tag: {displayed:?}"
);
}
#[test]
fn shutdown_variant_display() {
let err = Error::Shutdown;
let displayed = format!("{err}");
assert!(
!displayed.is_empty(),
"Shutdown must have a non-empty display message"
);
}
#[test]
fn simple_variants_display_without_panicking() {
for err in [
Error::SocketClosedUnexpectedly,
Error::UnicastSocketNotBound,
Error::ServiceNotFound,
Error::Shutdown,
] {
let _ = format!("{err}");
}
}
}