iron_inspect/
lib.rs

1extern crate iron;
2use iron::middleware::{AfterMiddleware, BeforeMiddleware};
3use iron::prelude::*;
4
5use std::marker::PhantomData;
6
7pub enum InspectRequest {}
8pub enum InspectResult {}
9pub enum InspectResponse {}
10pub enum InspectError {}
11
12pub struct Inspect<F, What> {
13    f: F,
14    _phantom: PhantomData<What>,
15}
16
17impl<F> Inspect<F, ()> {
18    pub fn new(f: F) -> Inspect<F, InspectResult>
19    where
20        F: Fn(&Request, Result<&Response, &IronError>),
21    {
22        Inspect {
23            f,
24            _phantom: PhantomData,
25        }
26    }
27
28    pub fn request(f: F) -> Inspect<F, InspectRequest>
29    where
30        F: Fn(&Request),
31    {
32        Inspect {
33            f,
34            _phantom: PhantomData,
35        }
36    }
37
38    pub fn response(f: F) -> Inspect<F, InspectResponse>
39    where
40        F: Fn(&Request, &Response),
41    {
42        Inspect {
43            f,
44            _phantom: PhantomData,
45        }
46    }
47
48    pub fn error(f: F) -> Inspect<F, InspectError>
49    where
50        F: Fn(&Request, &IronError),
51    {
52        Inspect {
53            f,
54            _phantom: PhantomData,
55        }
56    }
57}
58
59impl<F> BeforeMiddleware for Inspect<F, InspectRequest>
60where
61    F: Send + Sync + 'static,
62    F: Fn(&Request),
63{
64    fn before(&self, req: &mut Request) -> IronResult<()> {
65        (self.f)(req);
66        Ok(())
67    }
68}
69
70impl<F> AfterMiddleware for Inspect<F, InspectResult>
71where
72    F: Send + Sync + 'static,
73    F: Fn(&Request, Result<&Response, &IronError>),
74{
75    fn after(&self, req: &mut Request, res: Response) -> IronResult<Response> {
76        (self.f)(req, Ok(&res));
77        Ok(res)
78    }
79
80    fn catch(&self, req: &mut Request, err: IronError) -> IronResult<Response> {
81        (self.f)(req, Err(&err));
82        Err(err)
83    }
84}
85
86impl<F> AfterMiddleware for Inspect<F, InspectResponse>
87where
88    F: Send + Sync + 'static,
89    F: Fn(&Request, &Response),
90{
91    fn after(&self, req: &mut Request, res: Response) -> IronResult<Response> {
92        (self.f)(req, &res);
93        Ok(res)
94    }
95}
96
97impl<F> AfterMiddleware for Inspect<F, InspectError>
98where
99    F: Send + Sync + 'static,
100    F: Fn(&Request, &IronError),
101{
102    fn catch(&self, req: &mut Request, err: IronError) -> IronResult<Response> {
103        (self.f)(req, &err);
104        Err(err)
105    }
106}