ruyi 0.1.6

An event-driven framework for non-blocking, asynchronous I/O in Rust
Documentation
use std::fmt;
use std::io;
use std::net::{Shutdown, SocketAddr};
use std::sync::atomic::{AtomicUsize, Ordering};

use io::{AsyncRead, AsyncWrite};
use net::TcpStream;
use nio::{ReadV, WriteV, IoVec};

#[derive(Debug)]
pub struct Session {
    conn: TcpStream,
    peer_addr: Option<SocketAddr>,
    conn_count: &'static AtomicUsize,
}

impl Session {
    #[inline]
    pub fn new(
        conn: TcpStream,
        peer_addr: Option<SocketAddr>,
        conn_count: &'static AtomicUsize,
    ) -> Self {
        Session {
            conn,
            peer_addr,
            conn_count,
        }
    }

    #[inline]
    pub fn peer_addr(&self) -> io::Result<SocketAddr> {
        match self.peer_addr {
            Some(ref addr) => Ok(*addr),
            None => self.conn.peer_addr(),
        }
    }

    #[inline]
    pub fn local_addr(&self) -> io::Result<SocketAddr> {
        self.conn.local_addr()
    }

    #[inline]
    pub fn shutdown(&self, how: Shutdown) -> io::Result<()> {
        self.conn.shutdown(how)
    }

    #[inline]
    pub fn set_nodelay(&self, nodelay: bool) -> io::Result<()> {
        self.conn.set_nodelay(nodelay)
    }

    #[inline]
    pub fn nodelay(&self) -> io::Result<bool> {
        self.conn.nodelay()
    }

    #[inline]
    pub fn set_ttl(&self, ttl: u32) -> io::Result<()> {
        self.conn.set_ttl(ttl)
    }

    #[inline]
    pub fn ttl(&self) -> io::Result<u32> {
        self.conn.ttl()
    }
}

impl fmt::Display for Session {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        self.conn.fmt(f)
    }
}

impl io::Read for Session {
    #[inline]
    fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
        self.conn.read(buf)
    }
}

impl ReadV for Session {
    #[inline]
    fn readv(&mut self, iovs: &[IoVec]) -> io::Result<usize> {
        self.conn.readv(iovs)
    }
}

impl AsyncRead for Session {
    #[inline]
    fn need_read(&mut self) -> io::Result<()> {
        self.conn.need_read()
    }

    #[inline]
    fn no_need_read(&mut self) -> io::Result<()> {
        self.conn.no_need_read()
    }

    #[inline]
    fn is_readable(&self) -> bool {
        self.conn.is_readable()
    }
}

impl io::Write for Session {
    #[inline]
    fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
        self.conn.write(buf)
    }

    #[inline]
    fn flush(&mut self) -> io::Result<()> {
        self.conn.flush()
    }
}

impl WriteV for Session {
    #[inline]
    fn writev(&mut self, iovs: &[IoVec]) -> io::Result<usize> {
        self.conn.writev(iovs)
    }
}

impl AsyncWrite for Session {
    #[inline]
    fn need_write(&mut self) -> io::Result<()> {
        self.conn.need_write()
    }

    #[inline]
    fn no_need_write(&mut self) -> io::Result<()> {
        self.conn.no_need_write()
    }

    #[inline]
    fn is_writable(&self) -> bool {
        self.conn.is_writable()
    }
}

impl Drop for Session {
    fn drop(&mut self) {
        self.conn_count.fetch_sub(1, Ordering::Relaxed);
    }
}