mio-gate 0.1.2

a server lib base on mio
Documentation
use std::io::{ErrorKind, self};

use mio::{net::TcpListener, Poll, Token, Interest, event::Event};

use crate::tcp::Tcp;

use super::hub::Hub;
const LISTENER: Token = Token(0);
pub struct Gate {
    listener:TcpListener,
    pub hub:Hub
}

impl Gate {
    pub fn new(addr:&str,p:&Poll) -> io::Result<Gate> {
        let mut listener = Tcp::bind(addr)?;
        p.registry().register(&mut listener, LISTENER, Interest::READABLE)?;
        Ok(Gate{ listener, hub:Hub::new(0) })
    }

    pub fn process(&mut self, event:&Event,p:&Poll) {
        match event.token() {
            LISTENER => { self.on_listener_event(event,p); }
            _ => { self.hub.process(event); }
        }
    }

    fn on_listener_event(&mut self,event:&Event,p:&Poll) {
        if event.is_error() {
            return ;
        }

        loop {
            match self.listener.accept() {
                Ok((socket, _)) => {
                    self.hub.new_line(socket, p);
                }
                    
                Err(err) if err.kind() == ErrorKind::WouldBlock => { break; }
                
                _ => { 
                    panic!(); 
                }
            }
        }
    }

}