From ff75fa542a98cf9a79133a81b7716401e717bfd6 Mon Sep 17 00:00:00 2001 From: omagdy7 Date: Wed, 5 Jun 2024 18:13:08 +0300 Subject: codecrafters submit [skip ci] --- src/router.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/router.rs (limited to 'src/router.rs') diff --git a/src/router.rs b/src/router.rs new file mode 100644 index 0000000..1d8e6f2 --- /dev/null +++ b/src/router.rs @@ -0,0 +1,62 @@ +use crate::{ + extractor::build_regex_from_path, + http_types::{Method, StatusCode}, + request::Request, + response::Response, +}; +use regex::Regex; +use std::collections::HashMap; + +type Handler = fn(&Request, Option<&HashMap>) -> Response; +type Routes = HashMap; + +pub struct Router { + routes: Routes, +} + +impl Router { + // Create a new Router + pub fn new() -> Self { + Router { + routes: HashMap::new(), + } + } + + pub fn routes(&self) -> &Routes { + &self.routes + } + + // Add a route to the router + pub fn route(&mut self, method: Method, handler: Handler) -> &mut Self { + use Method::*; + + let method_string = match &method { + Get(s) | Post(s) | Put(s) => s, + }; + + let re = build_regex_from_path(method_string.as_str()); + let meth = Get(re.to_string()); + dbg!(&meth); + self.routes.insert(meth, handler); + self + } + + // Handle incoming requests + pub fn handle(&self, request: &Request, ctx: Option<&HashMap>) -> Response { + use Method::*; + let method_string = match &request.method { + Get(s) | Post(s) | Put(s) => s, + }; + for (method, handler) in self.routes() { + let route_method = match method { + Get(s) | Post(s) | Put(s) => s.as_str(), + }; + let re = Regex::new(route_method).unwrap(); + dbg!(&re, method_string); + if re.is_match(method_string) { + return handler(request, ctx); + } + } + Response::new("1.1".to_string(), StatusCode::NotFound, None, None).into() + } +} -- cgit v1.2.3