mio-gate 0.1.2

a server lib base on mio
Documentation
use std::collections::HashMap;

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

use crate::header::EventTag;

use super::line::Line;

pub struct Hub {
    id:u64,
    m:HashMap<Token,Line>,
    hook:Option<fn(tag:EventTag,data:&[u8])>
}

//Set

impl Hub {
    
    pub fn new(id:u64) -> Hub {
        Hub { id,m:HashMap::new(),hook:None }
    }

    pub fn process(&mut self,event:&Event) {
        let k = &event.token();

        if event.is_error() {
            return;
        }
        
        if event.is_writable() {
            self.get_mut_line(k).on_writable();
        }

        if event.is_readable() {
            self.process_read(k);
        }

    }

    pub fn new_line(&mut self,mut stream:TcpStream,p:&Poll) {
        let id = self.next_id();
        let token = Token(id.try_into().unwrap());
        p.registry().register(&mut stream, token, Interest::READABLE | Interest::WRITABLE).unwrap();
        let line = Line::new(id,stream);
        let f = self.hook.unwrap();
        f(EventTag::Establish,format!("{:?}",line).as_bytes());
        self.m.insert(token, line);
        
    }

    pub fn get_mut_line(&mut self,token:&Token) -> &mut Line {
        self.m.get_mut(token).unwrap()
    }

    pub fn set_hook(&mut self,f:fn(tag:EventTag,data:&[u8])) {
        self.hook = Some(f);
    }

    pub fn next_id(&mut self) -> u64 {
        self.id = self.id + 1;
        self.id
    }

    fn process_read(&mut self,k:&Token) {
        let vec = self.get_mut_line(k).recv();
        let f = self.hook.unwrap();
        f(EventTag::Data,&vec);
        
    }

}