Skip to content

Instantly share code, notes, and snippets.

@tdakkota
Created October 14, 2019 10:04
Show Gist options
  • Save tdakkota/05326870e6670962d60f0d60df65598f to your computer and use it in GitHub Desktop.
Save tdakkota/05326870e6670962d60f0d60df65598f to your computer and use it in GitHub Desktop.
example middleware
type Handler = Box<Fn(i32) -> i32>;
type Middleware = fn(Handler) -> Handler;
struct Router {
middleware: Vec<Middleware>,
}
impl Router {
pub fn new() -> Router {
Router {
middleware: Vec::new(),
}
}
pub fn add_middleware(mut self, middleware: Middleware) -> Self {
self.middleware.push(middleware);
self
}
fn middleware(&self, next: Handler) -> Handler {
if self.middleware.len() == 0 {
next
} else {
self.next_middleware(self.middleware.len() - 1, next)
}
}
fn next_middleware(&self, index: usize, next: Handler) -> Handler {
let current = self.middleware.get(index).unwrap();
match index == 0 {
true => current(next),
false => current(self.next_middleware(index - 1, next))
}
}
}
fn my_middleware(next: Handler) -> Handler {
println!("middleware");
let f = move |req: i32| -> i32 {
next(req - 1)
};
Box::new(f)
}
fn handler(req: i32) -> i32 {
println!("handler");
req + 1
}
pub fn main() {
let r = Router::new().add_middleware(my_middleware);
let result = r.middleware(Box::new(handler))(31);
println!("{}", result);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment