use std::io::Result;
use crate::address::SocketAddress;
use rama_core::ServiceInput;
use rama_core::extensions::Extension;
pub trait Socket: Send + Sync + 'static {
fn local_addr(&self) -> Result<SocketAddress>;
fn peer_addr(&self) -> Result<SocketAddress>;
}
impl Socket for std::net::TcpStream {
#[inline]
fn local_addr(&self) -> Result<SocketAddress> {
self.local_addr().map(Into::into)
}
#[inline]
fn peer_addr(&self) -> Result<SocketAddress> {
self.peer_addr().map(Into::into)
}
}
impl Socket for tokio::net::TcpStream {
#[inline]
fn local_addr(&self) -> Result<SocketAddress> {
self.local_addr().map(Into::into)
}
#[inline]
fn peer_addr(&self) -> Result<SocketAddress> {
self.peer_addr().map(Into::into)
}
}
impl Socket for std::net::UdpSocket {
#[inline]
fn local_addr(&self) -> Result<SocketAddress> {
self.local_addr().map(Into::into)
}
#[inline]
fn peer_addr(&self) -> Result<SocketAddress> {
self.peer_addr().map(Into::into)
}
}
impl Socket for tokio::net::UdpSocket {
#[inline]
fn local_addr(&self) -> Result<SocketAddress> {
self.local_addr().map(Into::into)
}
#[inline]
fn peer_addr(&self) -> Result<SocketAddress> {
self.peer_addr().map(Into::into)
}
}
impl<T: Socket> Socket for ServiceInput<T> {
#[inline]
fn local_addr(&self) -> std::io::Result<SocketAddress> {
self.input.local_addr()
}
#[inline]
fn peer_addr(&self) -> std::io::Result<SocketAddress> {
self.input.peer_addr()
}
}
#[derive(Debug, Clone, Extension)]
#[extension(tags(net))]
pub struct SocketInfo {
local_addr: Option<SocketAddress>,
peer_addr: SocketAddress,
}
impl SocketInfo {
#[must_use]
pub fn new(local_addr: Option<SocketAddress>, peer_addr: SocketAddress) -> Self {
Self {
local_addr,
peer_addr,
}
}
#[must_use]
pub fn local_addr(&self) -> Option<SocketAddress> {
self.local_addr
}
#[must_use]
pub fn peer_addr(&self) -> SocketAddress {
self.peer_addr
}
}