Skip to main content

ho/
middleware.rs

1use router::*;
2use http::*;
3
4pub trait Middleware {
5    fn call(&self, req: Request, args: Args, handle: &mut MiddlewareHandle) -> Response;
6}
7
8pub struct MiddlewareStore {
9    middleware: Vec<Box<Middleware+Sync+Send>>
10}
11
12#[allow(dead_code)]
13impl<'a, 'b> MiddlewareStore {
14    pub fn new() -> MiddlewareStore {
15        MiddlewareStore {
16            middleware: Vec::new()
17        }
18    }
19
20    pub fn add(&mut self, mw: Box<Middleware+Sync+Send>) {
21        self.middleware.push(mw);
22    }
23
24    pub fn get_handle(&'a self, router: &'b Fn(Request, Args) -> Response)-> MiddlewareHandle<'a, 'b> {
25        MiddlewareHandle::new(self, router)
26    }
27}
28
29pub struct MiddlewareHandle<'a, 'b> {
30    store: &'a MiddlewareStore,
31    pointer: usize,
32    router: &'b Fn(Request, Args) -> Response
33}
34
35impl<'a, 'b> MiddlewareHandle<'a, 'b> {
36    pub fn new(store: &'a MiddlewareStore, router: &'b Fn(Request, Args) -> Response) -> MiddlewareHandle<'a, 'b> {
37        MiddlewareHandle {
38            store,
39            pointer: 0,
40            router
41        }
42    }
43
44    pub fn next(&mut self, req: Request, args: Args) -> Response {
45        if self.pointer < self.store.middleware.len() {
46            let next = &self.store.middleware[self.pointer];
47            self.pointer += 1;
48            next.call(req, args, self)
49        } else {
50            let tmp = (self.router)(req,args);
51            tmp
52        }
53    }
54}