shape_wire/transport/
mod.rs1use std::sync::Arc;
8use std::time::Duration;
9
10#[derive(Debug, thiserror::Error)]
12pub enum TransportError {
13 #[error("connection failed: {0}")]
14 ConnectionFailed(String),
15 #[error("send failed: {0}")]
16 SendFailed(String),
17 #[error("receive failed: {0}")]
18 ReceiveFailed(String),
19 #[error("timeout")]
20 Timeout,
21 #[error("connection closed")]
22 ConnectionClosed,
23 #[error("payload too large: {size} bytes (max {max})")]
24 PayloadTooLarge { size: usize, max: usize },
25 #[error("io error: {0}")]
26 Io(#[from] std::io::Error),
27}
28
29pub trait Transport: Send + Sync {
34 fn send(&self, destination: &str, payload: &[u8]) -> Result<Vec<u8>, TransportError>;
38
39 fn connect(&self, destination: &str) -> Result<Box<dyn Connection>, TransportError>;
41}
42
43pub trait Connection: Send {
45 fn send(&mut self, payload: &[u8]) -> Result<(), TransportError>;
47
48 fn recv(&mut self, timeout: Option<Duration>) -> Result<Vec<u8>, TransportError>;
50
51 fn close(&mut self) -> Result<(), TransportError>;
53
54 fn supports_sidecars(&self) -> bool {
60 false
61 }
62
63 fn send_sidecar(&mut self, payload: &[u8]) -> Result<(), TransportError> {
65 self.send(payload)
66 }
67
68 fn recv_any(&mut self, timeout: Option<Duration>) -> Result<Vec<u8>, TransportError> {
70 self.recv(timeout)
71 }
72}
73
74impl<T: Transport + ?Sized> Transport for Arc<T> {
75 fn send(&self, destination: &str, payload: &[u8]) -> Result<Vec<u8>, TransportError> {
76 self.as_ref().send(destination, payload)
77 }
78
79 fn connect(&self, destination: &str) -> Result<Box<dyn Connection>, TransportError> {
80 self.as_ref().connect(destination)
81 }
82}
83
84pub mod factory;
85pub mod framing;
86pub mod memoized;
87pub mod tcp;
88
89#[cfg(feature = "quic")]
90pub mod quic;