Documentation
use crate::{request::HTTPMethod, Request, Response};
mod conversion_router_mod;
mod match_router_mod;

pub use conversion_router_mod::conversion_router;
pub use match_router_mod::{MatchRoute, MatchRouter, match_route, match_route_path};

type HandleFn = fn(request: &Request) -> crate::Result<Response>;
pub type Route = (HTTPMethod, String, HandleFn);

pub struct Router {
    root: Option<String>,
    get: Vec<Route>,
    post: Vec<Route>,
    router: Vec<Router>,
}

impl Router {
    pub fn new() -> Self {
        Router {
            root: None,
            get: vec![],
            post: vec![],
            router: vec![],
        }
    }

    pub fn root(&mut self, root: &str) {
        self.root = Some(root.to_string());
    }

    pub fn get(&mut self, path: &str, handle: HandleFn) {
        self.get.push((HTTPMethod::GET, path.to_string(), handle));
    }

    pub fn post(&mut self, path: &str, handle: HandleFn) {
        self.post.push((HTTPMethod::POST, path.to_string(), handle));
    }

    pub fn route(&mut self, route: Route) {
        match route.0 {
            HTTPMethod::GET => self.get(&route.1, route.2),
            HTTPMethod::POST => self.post(&route.1, route.2),
        }
    }

    pub fn router(&mut self, router: Router) {
        self.router.push(router);
    }
}