1use response::response;
14use router::Router;
15use web_sys::{Request, Response, Url};
16
17#[macro_use]
18pub mod macros;
19pub mod response;
20pub mod router;
21
22pub type Params = Vec<(String, String)>;
23type Handler = Box<dyn Fn(Request, Params) -> Response>;
24
25pub struct WebWorker {
26 router: Router,
27}
28
29impl WebWorker {
30 pub fn new() -> WebWorker {
31 WebWorker {
32 router: Router::new(),
33 }
34 }
35
36 pub fn handle(&self, request: Request) -> Response {
37 let url = Url::new(&request.url()).unwrap();
38 let path = format!("/{}{}", request.method().as_str(), &url.pathname());
39 match self.router.tree.find(&path) {
40 Some((func, params)) => {
41 let params = params
42 .iter()
43 .map(|p| (p.0.to_string(), p.1.to_string()))
44 .collect::<Params>();
45 func(request, params)
46 }
47 None => {
48 let body = "404 - Not Found".to_string();
49 let headers = headers! {
50 "Content-Type" => "text/html; charset=UTF-8",
51 "Cache-Control" => "no-cache"
52 };
53 response(body, headers, Some(404))
54 }
55 }
56 }
57
58 pub fn mount(&mut self, router: Router) {
59 self.router = router;
60 }
61}