webworker/
lib.rs

1//! WebWorker is a simple web server for a worker optimize
2//!
3//! # Example
4//! ```
5//! let mut router = Router::new();
6//! router.get("/", Box::new(index));
7//! let mut ww = WebWorker::new();
8//! ww.mount(router);
9//! ww.handle(request)
10//! ```
11//!
12
13use 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}