#[derive(Debug, thiserror::Error)]
pub enum ClientError {
#[error("no reachable endpoints")]
NoReachableEndpoints,
#[error("transport: {0}")]
Transport(#[from] tonic::transport::Error),
#[error("transport (fanned out to coalesced waiter): {0}")]
TransportFanout(String),
#[error("rpc: {0}")]
Rpc(#[from] tonic::Status),
#[error("invalid endpoint: {0}")]
InvalidEndpoint(String),
#[error("invalid count: {0}")]
InvalidCount(u32),
#[error("custom channel connector failed: {0}")]
Connector(#[source] Box<dyn std::error::Error + Send + Sync + 'static>),
#[error("client driver task is gone; subsequent requests cannot be served by this Client")]
DriverGone,
#[error("dense sequence outcome uncertain: the request may or may not have committed")]
SeqUncertain,
#[error("invalid sequence key")]
InvalidSeqKey,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn connector_variant_renders_source_in_display() {
let inner: Box<dyn std::error::Error + Send + Sync + 'static> = "boom".into();
let err = ClientError::Connector(inner);
assert_eq!(err.to_string(), "custom channel connector failed: boom");
}
#[test]
fn connector_variant_exposes_source() {
use std::error::Error;
let inner: Box<dyn std::error::Error + Send + Sync + 'static> =
std::io::Error::other("io-err").into();
let err = ClientError::Connector(inner);
assert!(err.source().is_some(), "Connector must propagate source()");
}
}