use crate::structs::definition::Callback;
use crate::utils::handler::handler;
use std::net::SocketAddr;
use std::sync::Arc;
use tokio::io::Error;
use tokio::net::{TcpListener, TcpStream};
use tokio::spawn;
#[derive(Default, Clone)]
pub struct Server {
pub(crate) adds: Vec<(String, String, Vec<Arc<Callback>>)>,
}
impl Server {
pub fn new() -> Server {
Default::default()
}
pub fn add(&mut self, args: (&str, &str, Vec<Arc<Callback>>)) {
self.adds
.push((args.0.to_owned(), args.1.to_owned(), args.2));
}
pub async fn run(&self, address: &str) {
let listener: TcpListener = TcpListener::bind(address)
.await
.expect("[Error] Fail to bind TCP Listener");
loop {
let listener_accept: Result<(TcpStream, SocketAddr), Error> = listener.accept().await;
if listener_accept.is_err() {
continue;
}
let (stream, address) = listener_accept.expect("[Error] Fail to Accept Connection");
spawn(handler(self.to_owned(), address, stream));
}
}
}