1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use std::collections::HashMap;
use std::io::Cursor;
use tiny_http::{Request, Response};
pub enum Responsa {
None,
Exists(Response<Cursor<Vec<u8>>>)
}
pub struct CallFrame<'a> {
pub req: &'a mut Request,
pub resp: Responsa,
pub abend: bool,
pub kv: HashMap<String, String>
}
pub struct Middleware
{
pub generic_before: Vec<fn(&mut CallFrame)>,
pub generic_after: Vec<fn(&mut CallFrame)>,
}
impl Middleware {
pub fn new() -> Middleware {
Middleware {
generic_before: Vec::new(),
generic_after: Vec::new(),
}
}
}
pub struct RouteTable {
pub table: HashMap<String, fn(&mut CallFrame)>
}
impl RouteTable {
pub fn new() -> RouteTable {
RouteTable {
table: HashMap::new()
}
}
}
pub fn process(handlers: &RouteTable, mw: &Middleware, mut req: Request) -> () {
let route = req.url();
let mut collect_funcs: Vec<fn(&mut CallFrame)> = Vec::new();
collect_funcs.extend_from_slice(&mw.generic_before);
match handlers.table.get(route) {
None => {
}
Some(r) => {
collect_funcs.push(*r);
}
}
let mut cf = CallFrame { req: &mut req,
resp: Responsa::None,
kv: HashMap::new(),
abend: false };
for f in collect_funcs {
f(&mut cf);
if cf.abend {
break;
}
}
for f in &mw.generic_after {
f(&mut cf);
}
match cf.resp {
Responsa::Exists(r) => {
req.respond(r);
}
Responsa::None => {}
}
}
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}