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])>
}
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);
}
}