#[cfg(feature = "compression")]
pub mod compression;
#[cfg(feature = "compression")]
pub mod wrapper;
#[cfg(feature = "compression")]
pub use compression::{
AsyncCompressor, CompressionStreamResult, TransportCompressionConfig,
TransportCompressionError, TransportCompressionStats, compress_transport, decompress_transport,
};
#[cfg(feature = "compression")]
pub use wrapper::CompressedTransport;
use async_trait::async_trait;
use std::fmt::Debug;
#[derive(Debug, Clone)]
pub struct TransportResponse {
pub status: u16,
pub body: Vec<u8>,
pub headers: Vec<(String, String)>,
}
impl TransportResponse {
pub fn new(status: u16, body: Vec<u8>) -> Self {
Self {
status,
body,
headers: Vec::new(),
}
}
pub fn success(body: Vec<u8>) -> Self {
Self::new(200, body)
}
pub fn error(status: u16, message: &str) -> Self {
Self::new(status, message.as_bytes().to_vec())
}
pub fn is_success(&self) -> bool {
(200..300).contains(&self.status)
}
}
#[async_trait]
pub trait Transport: Send + Sync + Debug {
async fn send(&self, data: &[u8]) -> anyhow::Result<TransportResponse>;
async fn send_async(&self, data: &[u8]) -> anyhow::Result<()>;
async fn health_check(&self) -> anyhow::Result<bool>;
fn metadata(&self) -> TransportMetadata;
}
#[derive(Debug, Clone)]
pub struct TransportMetadata {
pub name: String,
pub version: String,
pub supports_compression: bool,
pub max_payload_size: usize,
}
impl TransportMetadata {
pub fn new(name: &str, version: &str) -> Self {
Self {
name: name.to_string(),
version: version.to_string(),
supports_compression: false,
max_payload_size: 10 * 1024 * 1024, }
}
pub fn with_compression(mut self, supported: bool) -> Self {
self.supports_compression = supported;
self
}
pub fn with_max_payload(mut self, size: usize) -> Self {
self.max_payload_size = size;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transport_response() {
let response = TransportResponse::success(b"hello".to_vec());
assert!(response.is_success());
assert_eq!(response.status, 200);
assert_eq!(response.body, b"hello");
}
#[test]
fn test_transport_response_error() {
let response = TransportResponse::error(404, "Not found");
assert!(!response.is_success());
assert_eq!(response.status, 404);
}
#[test]
fn test_transport_metadata() {
let metadata = TransportMetadata::new("test", "1.0")
.with_compression(true)
.with_max_payload(1024);
assert_eq!(metadata.name, "test");
assert_eq!(metadata.version, "1.0");
assert!(metadata.supports_compression);
assert_eq!(metadata.max_payload_size, 1024);
}
}