use thiserror::Error;
#[derive(Debug, Error)]
pub enum QrpcError {
#[error("missing required builder field: {0}")]
MissingField(&'static str),
#[error("invalid frame magic")]
InvalidMagic,
#[error("frame too short")]
FrameTooShort,
#[error("packet decode failed: {0}")]
PacketDecode(#[from] prost::DecodeError),
#[error("io error: {0}")]
Io(#[from] std::io::Error),
#[error("quic write error: {0}")]
QuinnWrite(#[from] quinn::WriteError),
#[error("quic stream closed: {0}")]
QuinnClosedStream(#[from] quinn::ClosedStream),
#[error("quic read error: {0}")]
QuinnRead(#[from] quinn::ReadToEndError),
#[error("quic connect error: {0}")]
QuinnConnect(#[from] quinn::ConnectError),
#[error("quic connection error: {0}")]
QuinnConnection(#[from] quinn::ConnectionError),
#[error("rustls config error: {0}")]
Rustls(#[from] rustls::Error),
#[error("peer not found: {0}")]
PeerNotFound(String),
#[error("wait for peer timed out: peer_id={peer_id}, timeout={timeout:?}")]
PeerWaitTimeout {
peer_id: String,
timeout: std::time::Duration,
},
#[error("peer registration mismatch, expected {expected}, got {actual}")]
PeerIdMismatch { expected: String, actual: String },
#[error("message decode error: {0}")]
MessageDecode(String),
}
pub type QrpcResult<T> = Result<T, QrpcError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn missing_field_display() {
let err = QrpcError::MissingField("port");
assert!(err.to_string().contains("port"));
}
}