use futures_lite::{AsyncRead, AsyncWrite};
use std::{any::Any, borrow::Cow, io::Result, net::SocketAddr, time::Duration};
#[allow(unused)]
pub trait Transport: Any + AsyncRead + AsyncWrite + Unpin + Send + Sync + 'static {
fn set_linger(&mut self, linger: Option<Duration>) -> Result<()> {
Ok(())
}
fn set_nodelay(&mut self, nodelay: bool) -> Result<()> {
Ok(())
}
fn set_ip_ttl(&mut self, ttl: u32) -> Result<()> {
Ok(())
}
fn peer_addr(&self) -> Result<Option<SocketAddr>> {
Ok(None)
}
fn negotiated_alpn(&self) -> Option<Cow<'_, [u8]>> {
None
}
}
impl Transport for Box<dyn Transport> {
fn set_linger(&mut self, linger: Option<Duration>) -> Result<()> {
(**self).set_linger(linger)
}
fn set_nodelay(&mut self, nodelay: bool) -> Result<()> {
(**self).set_nodelay(nodelay)
}
fn set_ip_ttl(&mut self, ttl: u32) -> Result<()> {
(**self).set_ip_ttl(ttl)
}
fn peer_addr(&self) -> Result<Option<SocketAddr>> {
(**self).peer_addr()
}
fn negotiated_alpn(&self) -> Option<Cow<'_, [u8]>> {
(**self).negotiated_alpn()
}
}
impl Transport for trillium_http::Synthetic {}
impl Transport for trillium_http::h2::H2Transport {
fn negotiated_alpn(&self) -> Option<Cow<'_, [u8]>> {
Some(Cow::Borrowed(b"h2"))
}
}