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}