use crate::route::{HandlerFunc, Router, Middleware};
use std::net::{ToSocketAddrs, TcpListener};
use std::sync::Arc;
pub struct Server {
router: Router,
}
impl Server {
pub fn new() -> Self {
Self { router: Router::new() }
}
pub fn r#use(&mut self, key: (&str, &str), middleware: Middleware) {
let method = key.0.to_string();
let path = key.1.to_string();
self.router.r#use((method, path), middleware);
}
pub fn handle_func(&mut self, key: (&str, &str), handler: HandlerFunc) {
let method = key.0.to_string();
let path = key.1.to_string();
self.router.handle((method, path), handler);
}
pub fn listen_and_serve<A>(self, addr: A) -> std::io::Result<()>
where A: ToSocketAddrs
{
let listener = TcpListener::bind(addr)?;
let router = Arc::new(self.router);
while let Ok((stream, addr)) = listener.accept() {
let router = Arc::clone(&router);
router.route(stream, addr);
}
Ok(())
}
}