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}