qrpc 0.1.2

qrpc is a small QUIC + mTLS messaging library
Documentation
use thiserror::Error;

/// All runtime/build errors produced by `qrpc`.
#[derive(Debug, Error)]
pub enum QrpcError {
    /// A required builder field was not provided.
    #[error("missing required builder field: {0}")]
    MissingField(&'static str),
    /// The frame start/end magic bytes are invalid.
    #[error("invalid frame magic")]
    InvalidMagic,
    /// The frame is shorter than the minimum valid size.
    #[error("frame too short")]
    FrameTooShort,
    /// The protobuf payload could not be decoded.
    #[error("packet decode failed: {0}")]
    PacketDecode(#[from] prost::DecodeError),
    /// Generic I/O failure.
    #[error("io error: {0}")]
    Io(#[from] std::io::Error),
    /// QUIC write-side failure.
    #[error("quic write error: {0}")]
    QuinnWrite(#[from] quinn::WriteError),
    /// QUIC stream was already closed.
    #[error("quic stream closed: {0}")]
    QuinnClosedStream(#[from] quinn::ClosedStream),
    /// QUIC read-side failure.
    #[error("quic read error: {0}")]
    QuinnRead(#[from] quinn::ReadToEndError),
    /// QUIC connect initiation failed.
    #[error("quic connect error: {0}")]
    QuinnConnect(#[from] quinn::ConnectError),
    /// QUIC connection-level failure.
    #[error("quic connection error: {0}")]
    QuinnConnection(#[from] quinn::ConnectionError),
    /// Rustls config/validation failure.
    #[error("rustls config error: {0}")]
    Rustls(#[from] rustls::Error),
    /// Target peer ID was not found in the live registry.
    #[error("peer not found: {0}")]
    PeerNotFound(String),
    /// Waiting for a peer registration timed out.
    #[error("wait for peer timed out: peer_id={peer_id}, timeout={timeout:?}")]
    PeerWaitTimeout {
        peer_id: String,
        timeout: std::time::Duration,
    },
    /// Peer registration returned an unexpected ID.
    #[error("peer registration mismatch, expected {expected}, got {actual}")]
    PeerIdMismatch { expected: String, actual: String },
    /// Custom user message decode/validation failure.
    #[error("message decode error: {0}")]
    MessageDecode(String),
}

/// Convenience result alias used across the crate.
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"));
    }
}