use std::fmt;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TransportErrorKind {
ConnectionFailed,
ConnectionClosed,
ReadFailed,
WriteFailed,
TlsError,
DnsResolutionFailed,
Timeout,
InvalidMessage,
ProtocolViolation,
ResourceExhausted,
RateLimited,
}
impl fmt::Display for TransportErrorKind {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::ConnectionFailed => write!(f, "connection failed"),
Self::ConnectionClosed => write!(f, "connection closed"),
Self::ReadFailed => write!(f, "read failed"),
Self::WriteFailed => write!(f, "write failed"),
Self::TlsError => write!(f, "TLS error"),
Self::DnsResolutionFailed => write!(f, "DNS resolution failed"),
Self::Timeout => write!(f, "timeout"),
Self::InvalidMessage => write!(f, "invalid message"),
Self::ProtocolViolation => write!(f, "protocol violation"),
Self::ResourceExhausted => write!(f, "resource exhausted"),
Self::RateLimited => write!(f, "rate limited"),
}
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TransportContext {
#[serde(skip_serializing_if = "Option::is_none")]
pub transport_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub remote_addr: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub local_addr: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bytes_sent: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bytes_received: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connection_duration_ms: Option<u64>,
}
impl TransportContext {
#[must_use]
pub fn new(transport_type: impl Into<String>) -> Self {
Self {
transport_type: Some(transport_type.into()),
..Default::default()
}
}
#[must_use]
pub fn with_remote_addr(mut self, addr: impl Into<String>) -> Self {
self.remote_addr = Some(addr.into());
self
}
#[must_use]
pub fn with_local_addr(mut self, addr: impl Into<String>) -> Self {
self.local_addr = Some(addr.into());
self
}
}