rs-netty 1.1.0

A Tokio-native typed TCP/UDP pipeline framework inspired by Netty.
Documentation
use std::net::SocketAddr;
#[cfg(feature = "tls")]
use std::sync::Arc;

#[cfg(feature = "tls")]
use crate::tls::TlsInfo;

/// Identity information for one TCP connection.
#[cfg_attr(feature = "tls", derive(Clone))]
#[cfg_attr(not(feature = "tls"), derive(Clone, Copy))]
pub struct ConnInfo {
    id: u64,
    peer_addr: SocketAddr,
    local_addr: SocketAddr,
    #[cfg(feature = "tls")]
    tls: Option<Arc<TlsInfo>>,
}

impl ConnInfo {
    #[cfg(not(feature = "tls"))]
    pub(crate) fn new(id: u64, peer_addr: SocketAddr, local_addr: SocketAddr) -> Self {
        Self {
            id,
            peer_addr,
            local_addr,
            #[cfg(feature = "tls")]
            tls: None,
        }
    }

    #[cfg(feature = "tls")]
    pub(crate) fn new_with_tls(
        id: u64,
        peer_addr: SocketAddr,
        local_addr: SocketAddr,
        tls: Option<Arc<TlsInfo>>,
    ) -> Self {
        Self {
            id,
            peer_addr,
            local_addr,
            tls,
        }
    }

    /// Framework-assigned connection id.
    pub fn id(&self) -> u64 {
        self.id
    }

    /// Remote peer address.
    pub fn peer_addr(&self) -> SocketAddr {
        self.peer_addr
    }

    /// Local socket address.
    pub fn local_addr(&self) -> SocketAddr {
        self.local_addr
    }

    /// TLS metadata for this connection, when TLS is enabled and negotiated.
    #[cfg(feature = "tls")]
    pub fn tls(&self) -> Option<&TlsInfo> {
        self.tls.as_deref()
    }
}

/// Identity information for one UDP datagram.
#[cfg_attr(feature = "tls", derive(Clone))]
#[cfg_attr(not(feature = "tls"), derive(Clone, Copy))]
pub struct DatagramInfo {
    id: u64,
    peer_addr: SocketAddr,
    local_addr: SocketAddr,
    #[cfg(feature = "tls")]
    tls: Option<Arc<TlsInfo>>,
}

impl DatagramInfo {
    pub(crate) fn new(id: u64, peer_addr: SocketAddr, local_addr: SocketAddr) -> Self {
        Self {
            id,
            peer_addr,
            local_addr,
            #[cfg(feature = "tls")]
            tls: None,
        }
    }

    pub(crate) fn from_conn(info: ConnInfo) -> Self {
        Self {
            id: info.id(),
            peer_addr: info.peer_addr(),
            local_addr: info.local_addr(),
            #[cfg(feature = "tls")]
            tls: info.tls,
        }
    }

    /// Framework-assigned socket id.
    pub fn id(&self) -> u64 {
        self.id
    }

    /// Peer address for the current datagram.
    pub fn peer_addr(&self) -> SocketAddr {
        self.peer_addr
    }

    /// Local socket address.
    pub fn local_addr(&self) -> SocketAddr {
        self.local_addr
    }

    /// TLS metadata for this TCP-derived context, or `None` for UDP datagrams.
    #[cfg(feature = "tls")]
    pub fn tls(&self) -> Option<&TlsInfo> {
        self.tls.as_deref()
    }
}